目录 一 kubeadm介绍 1.1 概述 1.2 kubeadm功能 二 部署规划 2.1 节点规划 2.2 初始准备 2.3 互信配置 三 集群部署 3.1 Docker安装 3.2 相关组件包 3.3 正式安装 三 部署高可用组件I 3.1 Keepalived安装 3.2 创建配置文件 3.3 启动Keepalived 3.4 启动Nginx 四 初始化集群-Mater 4.1 Master上初始化 4.2 添加其他master节点 五 安装NIC插件 5.1 NIC插件介绍 5.2 部署calico 六 部署高可用组件II 6.1 高可用说明 七 添加Worker节点 7.1 下载镜像 7.2 添加Node节点 7.3 确认验证 八 开启IPVS 8.1 修改ConfigMap 九 测试集群 9.1 创建测试service 9.2 测试访问 十 部署dashboard 10.1 设置标签 10.2 创建证书 10.3 分发证书 10.4 手动创建secret 10.5 部署dashboard 10.6 查看dashboard参数 十一 访问dashboard 11.1 导入证书 11.2 创建kubeconfig文件 11.3 测试访问dashboard 十二 部署heapster 12.2 部署heapster 12.3 确认验证 回到顶部 一 kubeadm介绍 1.1 概述 参考《附003.Kubeadm部署Kubernetes》。 1.2 kubeadm功能 参考《附003.Kubeadm部署Kubernetes》。 回到顶部 二 部署规划 2.1 节点规划 节点主机名 IP 类型 运行服务 k8smaster01 172.24.8.71 Kubernetes master节点 docker、etcd、kube-apiserver、kube-scheduler、kube-controller-manager、kubectl、kubelet、heapster、calico k8smaster02 172.24.8.72 Kubernetes master节点 docker、etcd、kube-apiserver、kube-scheduler、kube-controller-manager、kubectl、 kubelet、heapster、calico k8smaster03 172.24.8.73 Kubernetes master节点 docker、etcd、kube-apiserver、kube-scheduler、kube-controller-manager、kubectl、 kubelet、heapster、calico k8snode01 172.24.8.74 Kubernetes node节点1 docker、kubelet、proxy、calico k8snode02 172.24.8.75 Kubernetes node节点2 docker、kubelet、proxy、calico k8snode03 172.24.8.76 Kubernetes node节点3 docker、kubelet、proxy、calico Kubernetes的高可用主要指的是控制平面的高可用,即指多套Master节点组件和Etcd组件,工作节点通过负载均衡连接到各Master。HA有通常有如下两种架构: 高可用架构一:etcd与Master节点组件混布在一起。 clipboard 高可用架构二:使用独立的Etcd集群,不与Master节点混布。 clipboard 释义: 两种方式的相同之处在于都提供了控制平面的冗余,实现了集群高可以用,区别在于: Etcd混布方式 所需机器资源少 部署简单,利于管理 容易进行横向扩展 风险大,一台宿主机挂了,master和etcd就都少了一套,集群冗余度受到的影响比较大。 Etcd独立部署方式: 所需机器资源多(按照Etcd集群的奇数原则,这种拓扑的集群关控制平面最少需要6台宿主机了) 部署相对复杂,要独立管理etcd集群和和master集群 解耦了控制平面和Etcd,集群风险小健壮性强,单独挂了一台master或etcd对集群的影响很小 提示:本实验使用高可用架构一实现Kubernetes的高可用。 2.2 初始准备 复制代码 1 [root@k8smaster01 ~]# vi k8sinit.sh 2 # Modify Author: xhy 3 # Modify Date: 2019-06-23 22:19 4 # Version: 5 #***************************************************************# 6 # Initialize the machine. This needs to be executed on every machine. 7 8 # Add host domain name. 9 cat >> /etc/hosts << EOF 10 172.24.8.71 k8smaster01 11 172.24.8.72 k8smaster02 12 172.24.8.73 k8smaster03 13 172.24.8.74 k8snode01 14 172.24.8.75 k8snode02 15 172.24.8.76 k8snode03 16 EOF 17 18 # Add docker user 19 useradd -m docker 20 21 # Disable the SELinux. 22 sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config 23 24 # Turn off and disable the firewalld. 25 systemctl stop firewalld 26 systemctl disable firewalld 27 28 # Modify related kernel parameters & Disable the swap. 29 cat > /etc/sysctl.d/k8s.conf << EOF 30 net.ipv4.ip_forward = 1 31 net.bridge.bridge-nf-call-ip6tables = 1 32 net.bridge.bridge-nf-call-iptables = 1 33 net.ipv4.tcp_tw_recycle = 0 34 vm.swappiness = 0 35 vm.overcommit_memory = 1 36 vm.panic_on_oom = 0 37 net.ipv6.conf.all.disable_ipv6 = 1 38 EOF 39 sysctl -p /etc/sysctl.d/k8s.conf >&/dev/null 40 swapoff -a 41 sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab 42 modprobe br_netfilter 43 44 # Add ipvs modules 45 cat > /etc/sysconfig/modules/ipvs.modules < /etc/docker/daemon.json < /etc/yum.repos.d/kubernetes.repo 2 [kubernetes] 3 name=Kubernetes 4 baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ 5 enabled=1 6 gpgcheck=1 7 repo_gpgcheck=1 8 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg 9 EOF 10 #配置yum源 复制代码 复制代码 1 [root@k8smaster01 ~]# yum search kubelet --showduplicates #查看相应版本 2 [root@k8smaster01 ~]# yum install -y kubeadm-1.15.6-0.x86_64 kubelet-1.15.6-0.x86_64 kubectl-1.15.6-0.x86_64 --disableexcludes=kubernetes 复制代码 clipboard 说明:同时安装了cri-tools, kubernetes-cni, socat三个依赖: socat:kubelet的依赖; cri-tools:即CRI(Container Runtime Interface)容器运行时接口的命令行工具。 复制代码 1 [root@k8smaster01 ~]# systemctl enable kubelet 复制代码 提示:所有Master+Worker节点均需要如上操作。此时不需要启动kubelet,初始化的过程中会自动启动的,如果此时启动了会出现报错,忽略即可。 回到顶部 三 部署高可用组件I 3.1 Keepalived安装 复制代码 1 [root@k8smaster01 ~]# wget https://www.keepalived.org/software/keepalived-2.0.19.tar.gz 2 [root@k8smaster01 ~]# tar -zxvf keepalived-2.0.19.tar.gz 3 [root@k8smaster01 ~]# cd keepalived-2.0.19/ 4 [root@k8smaster01 ~]# ./configure --sysconf=/etc --prefix=/usr/local/keepalived 5 [root@k8smaster01 keepalived-2.0.19]# make && make install 6 [root@k8smaster01 ~]# systemctl enable keepalived && systemctl start keepalived 复制代码 提示:所有Master节点均需要如上操作。 3.2 创建配置文件 复制代码 1 [root@k8smaster01 ~]# git clone https://github.com/cookeem/kubeadm-ha #拉取github的高可用自动配置脚本 2 [root@k8smaster01 ~]# vi /root/kubeadm-ha/kubeadm-config.yaml 3 apiVersion: kubeadm.k8s.io/v1beta1 4 kind: ClusterConfiguration 5 kubernetesVersion: v1.15.6 #配置安装的版本 6 …… 7 podSubnet: "10.10.0.0/16" #指定pod网段及掩码 8 …… 复制代码 clipboard 提示:若需要修改为国内Kubernetes初始化镜像源,可通过在kubeadm-config.yaml中追加如下参数,若参考4.1步骤提前下载: imageRepository: registry.cn-hangzhou.aliyuncs.com/google_container 复制代码 1 [root@k8smaster01 ~]# cd kubeadm-ha/ 2 [root@k8smaster01 kubeadm-ha]# vi create-config.sh 3 # master keepalived virtual ip address 4 export K8SHA_VIP=172.24.8.100 5 # master01 ip address 6 export K8SHA_IP1=172.24.8.71 7 # master02 ip address 8 export K8SHA_IP2=172.24.8.72 9 # master03 ip address 10 export K8SHA_IP3=172.24.8.73 11 # master keepalived virtual ip hostname 12 export K8SHA_VHOST=k8smaster01 13 # master01 hostname 14 export K8SHA_HOST1=k8smaster01 15 # master02 hostname 16 export K8SHA_HOST2=k8smaster02 17 # master03 hostname 18 export K8SHA_HOST3=k8smaster03 19 # master01 network interface name 20 export K8SHA_NETINF1=eth0 21 # master02 network interface name 22 export K8SHA_NETINF2=eth0 23 # master03 network interface name 24 export K8SHA_NETINF3=eth0 25 # keepalived auth_pass config 26 export K8SHA_KEEPALIVED_AUTH=412f7dc3bfed32194d1600c483e10ad1d 27 # calico reachable ip address 28 export K8SHA_CALICO_REACHABLE_IP=172.24.8.2 29 # kubernetes CIDR pod subnet 30 export K8SHA_CIDR=10.10.0.0 31 32 [root@k8smaster01 kubeadm-ha]# ./create-config.sh 复制代码 解释:所有Master节点均需要如上操作。执行脚本后会生产如下配置文件清单: 执行create-config.sh脚本后,会自动生成以下配置文件: kubeadm-config.yaml:kubeadm初始化配置文件,位于kubeadm-ha代码的./根目录 keepalived:keepalived配置文件,位于各个master节点的/etc/keepalived目录 nginx-lb:nginx-lb负载均衡配置文件,位于各个master节点的/root/nginx-lb目录 calico.yaml:calico网络组件部署文件,位于kubeadm-ha代码的./calico目录 3.3 启动Keepalived 复制代码 1 [root@k8smaster01 ~]# cat /etc/keepalived/keepalived.conf 2 [root@k8smaster01 ~]# cat /etc/keepalived/check_apiserver.sh 复制代码 clipboard 复制代码 1 [root@k8smaster01 ~]# systemctl restart keepalived.service 2 [root@k8smaster01 ~]# systemctl status keepalived.service 3 [root@k8smaster01 ~]# ping 172.24.8.100 4 复制代码 提示:所有Master节点均需要如上操作。 3.4 启动Nginx 执行create-config.sh脚本后,nginx-lb的配置文件会自动复制到各个master的节点的/root/nginx-lb目录 复制代码 1 [root@k8smaster01 ~]# cd /root/nginx-lb/ 复制代码 clipboard 复制代码 1 [root@k8smaster01 nginx-lb]# docker-compose up -d #使用docker-compose方式启动nginx-lb 2 [root@k8smaster01 ~]# docker-compose ps #检查nginx-lb启动状态 复制代码 提示:所有Master节点均需要如上操作。 回到顶部 四 初始化集群-Mater 4.1 Master上初始化 复制代码 1 [root@k8smaster01 ~]# kubeadm --kubernetes-version=v1.15.6 config images list #列出所需镜像 2 k8s.gcr.io/kube-apiserver:v1.15.6 3 k8s.gcr.io/kube-controller-manager:v1.15.6 4 k8s.gcr.io/kube-scheduler:v1.15.6 5 k8s.gcr.io/kube-proxy:v1.15.6 6 k8s.gcr.io/pause:3.1 7 k8s.gcr.io/etcd:3.3.10 8 k8s.gcr.io/coredns:1.3.1 复制代码 复制代码 1 [root@k8smaster01 ~]# kubeadm --kubernetes-version=v1.15.6 config images pull #拉取kubernetes所需镜像 复制代码 注意: 由于国内Kubernetes镜像可能无法pull,建议通过VPN等方式提前pull镜像,然后上传至所有master节点。 复制代码 1 [root@VPN ~]# docker pull k8s.gcr.io/kube-apiserver:v1.15.6 2 [root@VPN ~]# docker pull k8s.gcr.io/kube-controller-manager:v1.15.6 3 [root@VPN ~]# docker pull k8s.gcr.io/kube-scheduler:v1.15.6 4 [root@VPN ~]# docker pull k8s.gcr.io/kube-proxy:v1.15.6 5 [root@VPN ~]# docker pull k8s.gcr.io/pause:3.1 6 [root@VPN ~]# docker pull k8s.gcr.io/etcd:3.3.10 7 [root@VPN ~]# docker pull k8s.gcr.io/coredns:1.3.1 8 [root@k8smaster01 ~]# docker load -i kube-apiserver.tar 9 [root@k8smaster01 ~]# docker load -i kube-controller-manager.tar 10 [root@k8smaster01 ~]# docker load -i kube-scheduler.tar 11 [root@k8smaster01 ~]# docker load -i kube-proxy.tar 12 [root@k8smaster01 ~]# docker load -i pause.tar 13 [root@k8smaster01 ~]# docker load -i etcd.tar 14 [root@k8smaster01 ~]# docker load -i coredns.tar 复制代码 复制代码 1 [root@k8smaster01 ~]# kubeadm init --config=/root/kubeadm-ha/kubeadm-config.yaml --upload-certs 复制代码 clipboard 保留如下命令用于后续节点添加: 复制代码 1 You can now join any number of the control-plane node running the following command on each as root: 2 3 kubeadm join 172.24.8.100:16443 --token qcxeyv.q37rluk3qql8p9bf \ 4 --discovery-token-ca-cert-hash sha256:d8cf7c0384fff8779227f1a913d981d02b9f8f79a70365ba76a909e7160899a9 \ 5 --control-plane --certificate-key d8393e3d6c936c2e489e4aff53458c6c5b06ef2a8715f49529494cbd469c1471 6 7 Please note that the certificate-key gives access to cluster sensitive data, keep it secret! 8 As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use 9 "kubeadm init phase upload-certs --upload-certs" to reload certs afterward. 10 11 Then you can join any number of worker nodes by running the following on each as root: 12 13 kubeadm join 172.24.8.100:16443 --token qcxeyv.q37rluk3qql8p9bf \ 14 --discovery-token-ca-cert-hash sha256:d8cf7c0384fff8779227f1a913d981d02b9f8f79a70365ba76a909e7160899a9 复制代码 注意:如上token具有默认24小时的有效期,token和hash值可通过如下方式获取: kubeadm token list 如果 Token 过期以后,可以输入以下命令,生成新的 Token 复制代码 1 kubeadm token create 2 openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //' 3 复制代码 复制代码 1 [root@k8smaster01 ~]# mkdir -p $HOME/.kube 2 [root@k8smaster01 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube