# kubernetes-kubeadm **Repository Path**: xiaothu/kubernetes-kubeadm ## Basic Information - **Project Name**: kubernetes-kubeadm - **Description**: kubeadm安装k8s集群 - **Primary Language**: Docker - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 4 - **Created**: 2021-03-19 - **Last Updated**: 2022-09-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # kubernetes-kubeadm kubernetes企业级高可用集群部署 - kubeadm方式 # 一、实践环境准备 ## 1. 服务器说明 我们这里使用的是五台centos-7.6的虚拟机,具体信息如下表: | 系统类型 | IP地址 | 节点角色 | CPU | Memory | Hostname | | :------: | :--------: | :-------: | :-----: | :---------: | :-----: | | centos-7.6 | 192.168.8.170 | master | \>=2 | \>=2G | m1 | | centos-7.6 | 192.168.8.171 | master | \>=2 | \>=2G | m2 | | centos-7.6 | 192.168.8.172 | master | \>=2 | \>=2G | m3 | | centos-7.6 | 192.168.8.180 | worker | \>=2 | \>=2G | s1 | | centos-7.6 | 192.168.8.181 | worker | \>=2 | \>=2G | s2 | ## 2. 系统设置(所有节点) #### 2.1 主机名 主机名必须每个节点都不一样,并且保证所有点之间可以通过hostname互相访问。 ```bash # 查看主机名 $ hostname # 修改主机名 $ hostnamectl set-hostname # 配置host,使所有节点之间可以通过hostname互相访问 $ vi /etc/hosts # ``` #### 2.2 安装依赖包 ```bash # 更新yum $ yum update # 安装依赖包 $ yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp ``` #### 2.3 关闭防火墙、swap,重置iptables ```bash # 关闭防火墙 $ systemctl stop firewalld && systemctl disable firewalld # 重置iptables $ iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT # 关闭swap $ swapoff -a $ sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab # 关闭selinux $ setenforce 0 # 关闭dnsmasq(否则可能导致docker容器无法解析域名) $ service dnsmasq stop && systemctl disable dnsmasq ``` #### 2.4 系统参数设置 ```bash # 制作配置文件 $ cat > /etc/sysctl.d/kubernetes.conf < /etc/docker/daemon.json { "graph": "/docker/data/path", "exec-opts": ["native.cgroupdriver=systemd"] } EOF # 启动docker服务 service docker restart ``` ## 4. 安装必要工具(所有节点) #### 4.1 工具说明 - **kubeadm:** 部署集群用的命令 - **kubelet:** 在集群中每台机器上都要运行的组件,负责管理pod、容器的生命周期 - **kubectl:** 集群管理工具(可选,只要在控制集群的节点上安装即可) #### 4.2 安装方法 ```bash # 配置yum源(科学上网的同学可以把"mirrors.aliyun.com"替换为"packages.cloud.google.com") $ cat < /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF # 安装工具 # 找到要安装的版本号 $ yum list kubeadm --showduplicates | sort -r # 安装指定版本(这里用的是1.14.0) $ yum install -y kubeadm-1.14.0-0 kubelet-1.14.0-0 kubectl-1.14.0-0 --disableexcludes=kubernetes # 设置kubelet的cgroupdriver(kubelet的cgroupdriver默认为systemd,如果上面没有设置docker的exec-opts为systemd,这里就需要将kubelet的设置为cgroupfs) $ sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf # 启动kubelet $ systemctl enable kubelet && systemctl start kubelet ``` ## 5. 准备配置文件(任意节点) #### 5.1 下载配置文件 我这准备了一个项目,专门为大家按照自己的环境生成配置的。它只是帮助大家尽量的减少了机械化的重复工作。它并不会帮你设置系统环境,不会给你安装软件。总之就是会减少你的部署工作量,但不会耽误你对整个系统的认识和把控。 ```bash $ cd ~ && git clone https://github.com/huxiaotian180/kubernetes-kubeadm # 看看git内容 $ ls -l kubernetes-kubeadm addons/ configs/ scripts/ init.sh global-configs.properties ``` #### 5.2 文件说明 - **addons** > kubernetes的插件,比如calico和dashboard。 - **configs** > 包含了部署集群过程中用到的各种配置文件。 - **scripts** > 包含部署集群过程中用到的脚本,如keepalive检查脚本。 - **global-configs.properties** > 全局配置,包含各种易变的配置内容。 - **init.sh** > 初始化脚本,配置好global-config之后,会自动生成所有配置文件。 #### 5.3 生成配置 这里会根据大家各自的环境生成kubernetes部署过程需要的配置文件。 在每个节点上都生成一遍,把所有配置都生成好,后面会根据节点类型去使用相关的配置。 ```bash # cd到之前下载的git代码目录 $ cd kubernetes-kubeadm # 编辑属性配置(根据文件注释中的说明填写好每个key-value) $ vi global-config.properties # 生成配置文件,确保执行过程没有异常信息 $ ./init.sh # 查看生成的配置文件,确保脚本执行成功 $ find target/ -type f ``` > **执行init.sh常见问题:** > 1. Syntax error: "(" unexpected > - bash版本过低,运行:bash -version查看版本,如果小于4需要升级 > - 不要使用 sh init.sh的方式运行(sh和bash可能不一样哦) > 2. global-config.properties文件填写错误,需要重新生成 > 再执行一次./init.sh即可,不需要手动删除target ``` # 二、搭建高可用集群 ## 1. 部署keepalived - apiserver高可用(任选两个master节点) #### 1.1 安装keepalived ​```bash # 在两个主节点上安装keepalived(一主一备) $ yum install -y keepalived ``` 注意:脚本文件配置 ![](image/5.2.png) ![](image/5.3.1.png) ![](image/5.3.2.png) # 二. 搭建高可用集群 ## 1. 部署keepalived-apiserver高可用(任选两个master节点) #### 1.1 安装keepalived ```bash # 在两个主节点上安装keepalived(一主一备) $ yum install -y keepalived ``` #### 1.2 创建keepalived配置文件 ```bash # 创建目录 $ ssh @ "mkdir -p /etc/keepalived" $ ssh @ "mkdir -p /etc/keepalived" # 分发配置文件 $ scp target/configs/keepalived-master.conf @:/etc/keepalived/keepalived.conf $ scp target/configs/keepalived-backup.conf @:/etc/keepalived/keepalived.conf # 分发监测脚本 $ scp target/scripts/check-apiserver.sh @:/etc/keepalived/ $ scp target/scripts/check-apiserver.sh @:/etc/keepalived/ ``` #### 1.3 启动keepalived ```bash # 分别在master和backup上启动服务 $ systemctl enable keepalived && service keepalived start # 检查状态 $ service keepalived status # 查看日志 $ journalctl -f -u keepalived # 查看虚拟ip $ ip a ``` ## 2. 部署第一个主节点 ```bash # 准备配置文件 $ scp target/configs/kubeadm-config.yaml @:~ # ssh到第一个主节点,执行kubeadm初始化系统(注意保存最后打印的加入集群的命令) $ kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs # copy kubectl配置(上一步会有提示) $ mkdir -p ~/.kube $ cp -i /etc/kubernetes/admin.conf ~/.kube/config # 测试一下kubectl $ kubectl get pods --all-namespaces # **备份init打印的join命令** ``` ## 3. 部署网络插件 - calico 我们使用calico官方的安装方式来部署。 ```bash # 创建目录(在配置了kubectl的节点上执行) $ mkdir -p /etc/kubernetes/addons # 上传calico配置到配置好kubectl的节点(一个节点即可) $ scp target/addons/calico* @:/etc/kubernetes/addons/ # 部署calico $ kubectl apply -f /etc/kubernetes/addons/calico-rbac-kdd.yaml $ kubectl apply -f /etc/kubernetes/addons/calico.yaml # 查看状态 $ kubectl get pods -n kube-system ``` ## 4. 加入其它master节点 ```bash # 使用之前保存的join命令加入集群 $ kubeadm join ... # 耐心等待一会,并观察日志 $ journalctl -f # 查看集群状态 # 1.查看节点 $ kubectl get nodes # 2.查看pods $ kubectl get pods --all-namespaces ``` ## 5. 加入worker节点 ```bash # 使用之前保存的join命令加入集群 $ kubeadm join ... # 耐心等待一会,并观察日志 $ journalctl -f # 查看节点 $ kubectl get nodes ``` # 三、集群可用性测试 ## 1. 创建nginx ds ```bash # 写入配置 $ cat > nginx-ds.yml < # 检查service可达性 $ kubectl get svc # 在每个节点上访问服务 $ curl : # 在每个节点检查node-port可用性 $ curl : ``` ## 3. 检查dns可用性 ```bash # 创建一个nginx pod $ cat > pod-nginx.yaml <@:/etc/kubernetes/addons/ # 创建服务 $ kubectl apply -f /etc/kubernetes/addons/dashboard-all.yaml # 查看服务运行情况 $ kubectl get deployment kubernetes-dashboard -n kube-system $ kubectl --namespace kube-system get pods -o wide $ kubectl get services kubernetes-dashboard -n kube-system $ netstat -ntlp|grep 30005 ``` ## 2. 访问dashboard 为了集群安全,从 1.7 开始,dashboard 只允许通过 https 访问,我们使用nodeport的方式暴露服务,可以使用 https://NodeIP:NodePort 地址访问 关于自定义证书 默认dashboard的证书是自动生成的,肯定是非安全的证书,如果大家有域名和对应的安全证书可以自己替换掉。使用安全的域名方式访问dashboard。 在dashboard-all.yaml中增加dashboard启动参数,可以指定证书文件,其中证书文件是通过secret注进来的。 > \- –tls-cert-file \- dashboard.cer \- –tls-key-file \- dashboard.key ## 3. 登录dashboard Dashboard 默认只支持 token 认证,所以如果使用 KubeConfig 文件,需要在该文件中指定 token,我们这里使用token的方式登录 ```bash # 创建service account $ kubectl create sa dashboard-admin -n kube-system # 创建角色绑定关系 $ kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin # 查看dashboard-admin的secret名字 $ ADMIN_SECRET=$(kubectl get secrets -n kube-system | grep dashboard-admin | awk '{print $1}') # 打印secret的token $ kubectl describe secret -n kube-system ${ADMIN_SECRET} | grep -E '^token' | awk '{print $2}' ```