安装方式介绍
目前创建K8S集群的安装程序最受欢迎的有Kops,Kubespray,kubeadm,rancher,以及提供的脚本集等。
网页快捷安装推荐使用 rancher
ansible 脚本学习安装 推荐使用 kubeasz (这里我用的是ubuntu-1804)
高可用集群所需节点配置如下
master:三台(实验环境和etcd部署在同一台服务器上)
ectd :三台 (生产环境建议分开)
haproxy结合keepalived:一台(高可用方案可以做两台主从)
harbor:一台 (高可用方案可以做两台主从)
首先所有主机名添加解析,修改主机名(k8s中主机名必须是不同的)
root@ubuntu1804:# hostnamectl set-hostname k8s-master1.example.com root@ubuntu1804:# hostnamectl set-hostname k8s-node1.example.com root@ubuntu1804:~# hostnamectl set-hostname k8s-harbor1.example.com echo “127.0.1.1 k8s-master1.example.com” >> /etc/hosts echo “127.0.1.1 k8s-node1.example.com” >> /etc/hosts
添加源 安装需要下载一些基础服务
如果下载失败就更换阿里云 或者别的源 1 2 3 4 5 6 7 8 9 10 deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multivers
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 ## keepalived配置 首先我们把负载均衡安装好,如果是两台的话机器配置一样 (keepalived和haproxy只需要两台作为高可用) 1 root@k8s-ha1:~# apt install keepalived haproxy -y root@k8s-ha1:~# systemctl start keepalived.service haproxy.service && systemctl enable --now keepalived.service haproxy.service root@k8s-ha1:~# cp /usr/share/doc/keepalived/samples/keepalived.conf.vrrp /etc/keepalived/keepalived.conf ## Haproxy配置 k8s默认端口是6443 root@k8s-ha1:~# ss -ntl'grep 6443 root@k8s-ha1:~# scp /etc/haproxy/haproxy.cfg 10.0.0.84:/etc/haproxy/ - 最好两台haproxy都进行以下优化 默认没有VIP的 haproxy无法启动 ,是因为无法绑定没有的IP,需要添加参数,修改为 1 就可以 root@k8s-ha2:~# sysctl -a'grep "nonlocal_bind" echo "net.ipv4.ip_nonlocal_bind = 1" >> /etc/sysctl.conf #绑定不存在的虚拟IP echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf #开启路由转发 -生效参数 root@k8s-ha2:~# sysctl -p 这个时候就可以重启服务 systemctl restart haproxy.service ## harbor安装 安装docker和docker-compos,可以直接二进制安装 或者gitlab上面搜索,然后解压harbor #tar xvf harbor-offline-installer-v2.2.3.tgz #cp harbor.yml.tmpl harbor.yml 然后编辑harbor配置文件,不想走证书就注释https,修改密码等就可以安装harbor #./install.sh --with-trivy # k8s集群部署准备 > 基础环境准备进入www.github.com搜索 (kubeasz)里面有教程 > 基于ansibale部署k8s harbor用于我们的镜像分发,到公司做一些服务部署的时候最好是画一个图,方便日后我们观看 . 首先k8s会访问我们的keepalived 然后在把 请求转发给Apiserver,然后再由Api把请求转发到etcd里面 **集群规划和基础参数设定** * 注意1:确保各个节点的时间是一致的,推荐chrony * 注意2:确保在干净的系统上开始安装,不要使用曾经装过kubeadm或其他k8s发行版的环境 * 注意3:建议操作系统升级到新的稳定内核 ,1804以下需要升级 - **在部署节点安装ansible及准备ssh免密登陆** $ansible部署,主节点一台即可 #可以直接下载 apt-cache madison ansible 查看版本2.5以上都可以 curl -O https://bootstrap.pypa.io/pip/2.7/get-ip.py python get-pip.py python -m pip install --upgrade "pip < 21.0" #pip安装ansible(国内如果安装太慢可以直接用pip阿里云加速) pip install ansible -i https://mirrors.aliyun.com/pypi/simple/ # 在node节点以及master节点和etcd节点做免秘钥认证 #!/bin/bash IP=" 10.0.0.8 10.0.0.18 " for node in ${IP};do sshpass -p 123456 ssh-copy-id ${node} -o StrictHostKeyChecking=no if [ $? -eq 0 ];then echo "${node} 秘钥拷贝完成" else echo "${node} 秘钥拷贝失败" fi done # 部署节点k8s安装 - 1 docker可以自己手动安装 #因为需要用到docker 默认脚本可能有些慢,docker可以选择自己手动安装或者直接脚本安装 上方的步骤,https://mirrors.aliyun.com/ 进去之后搜索doceker-ce 有安装步骤 vim docker_install.sh sudo apt-get update sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common # step 2: 安装GPG证书 curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg ' sudo apt-key add - # Step 3: 写入软件源信息 sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" # Step 4: 更新并安装Docker-CE sudo apt-get -y update apt install docker-ce=5:19.03.15~3-0~ubuntu-bionic docker-ce-cli=5:19.03.15~3-0~ubuntu-bionic -y 2 - # 下载工具脚本ezdown,举例使用kubeasz版本3.1.0 export release=3.1.0 curl -C- -fLO --retry 3 https://github.com/easzlab/kubeasz/releases/download/${release}/ezdown chmod +x ./ezdown # 使用工具脚本下载,如果想更换下载的版本就修改ezdown,下面有key安装的服务版本号。是从清华源修改的 sed -i 's/DOCKER_VER=20.10.5/DOCKER_VER=19.03.15/g' ezdown ./ezdown -D #他会先判断docker等服务是否下载好 ,如果需要更改版本可以手动指定版本号 root@k8s-master1:~# /etc/kubeasz/bin/kube-apiserver --version root@k8s-master1:/usr/src/trojan# ls /etc/kubeasz/down/ calico_v3.15.3.tar dashboard_v2.2.0.tar flannel_v0.13.0-amd64.tar kubeasz_3.1.0.tar metrics-server_v0.3.6.tar pause_3.4.1.tar coredns_1.8.0.tar docker-20.10.5.tgz k8s-dns-node-cache_1.17.0.tar metrics-scraper_v1.0.6.tar nfs-provisioner_v4.0.1.tar pause.tar * **指定k8s集群** 先进入指定目录下面 root@k8s-master1:~# cd /etc/kubeasz/ -执行创建,创建好之后会在这个目录下面生成一个cluster目录,然后在创建 k8s01,后面管理需要进入这个目录去修改主机 root@k8s-master1:/etc/kubeasz# ./ezctl new k8s-01 root@k8s-master1:/etc/kubeasz# ./ezctl new k8s-02 root@k8s-master1:/etc/kubeasz/clusters/k8s-01# pwd /etc/kubeasz/clusters/k8s-01#定义我们k8s有哪些主机,支持多集群 - 编辑配置文件然后指定我们的集群名称(etcd,master,node) root@k8s-master1:/etc/kubeasz/clusters/k8s-01# vim hosts ::%s/192.168.1/10.0.0/g #搜索替换,我的服务器地址是10.0.0开头的,后期需要添加或者删除集群就在这里面删除地址 [etcd] 10.0.0.78 10.0.0.88 10.0.0.98 # work node(s) [kube_node] 10.0.0.48 10.0.0.58 10.0.0.68 # [optional] loadbalance for accessing k8s from outside 指定负载均衡地址 [ex_lb] 10.0.0.83 LB_ROLE=backup EX_APISERVER_VIP=10.0.0.22 EX_APISERVER_PORT=6443 Harbor不需要写 # Network plugins supported: calico, flannel, kube-router, cilium, kube-ovn 经常用的网络插件还有calico CLUSTER_NETWORK="calico" # K8S Service CIDR, not overlap with node(host) networking 指定Service网段 SERVICE_CIDR="10.100.0.0/16" # Cluster CIDR (Pod CIDR), not overlap with node(host) networking Cluster容器启动网段,注意不要和公司网段冲突 CLUSTER_CIDR="10.200.0.0/16" # NodePort Range 指定Service需要暴露端口范围 NODE_PORT_RANGE="30000-65000" # Cluster DNS Domain 指定域名 CLUSTER_DNS_DOMAIN="ythzjy.local" # Binaries Directory 放在/usr/bin方便执行命令路径 bin_dir="/usr/bin" #修改Cnfig.yml文件 - 修改好之后还需要修改config文件才能部署,定义集群版本信息(以及证书有效期) root@k8s-master1:/etc/kubeasz/clusters/k8s-01# vim config.yml # node节点最大pod 数 -默认110 MAX_PODS: 300 # coredns 自动安装 我们自己手动安装,dns加速也关闭 dns_install: "no" corednsVer: "1.8.0" ENABLE_LOCAL_DNS_CACHE: false #提供DNS域名缓存加速 # metric server 自动安装 metricsserver_install: "no" metricsVer: "v0.3.6" # dashboard 自动安装 dashboard_install: "no" - 部署k8s集群 root@k8s-master1:/etc/kubeasz# cat roles/prepare/templates/95-k8s-sysctl.conf.j2 #删除下面两个配置,不让k8s执行以下操作(我们已经安装好了) vim playbooks/01.prepare.yml - ex_lb - chrony - 部署k8s-01,会连接我们刚才指定的主机#代表部署我们k8s的第一个集群,后期还有集群就配置k8s-02,如果我们那个任务配置错误 是可以反复执行的 ,后期在添加服务器直接再跑一次这个脚本 root@k8s-master1:/etc/kubeasz# ./ezctl setup k8s-01 01 # 部署etcd - 查看etcd的规则 root@k8s-master1:/etc/kubeasz# cat playbooks/02.etcd.yml root@k8s-master1:/etc/kubeasz# cat roles/etcd/tasks/main.yml - 开始安装etcd root@k8s-master1:/etc/kubeasz# ./ezctl setup k8s-01 02 部署好之后就可以对外提供服务了 起来之后进入etcd服务器检查是否监听端口 root@k8s-etcd1:~# ss -ntl'grep 2379 LISTEN 0 32768 10.0.0.78:2379 0.0.0.0:* LISTEN 0 32768 127.0.0.1:2379 0.0.0.0:* 验证etcd服务,指定etcd集群,监测etcd心跳,如果是success代表正确 root@k8s-etcd1:~# export NODE_IPS="10.0.0.78 10.0.0.88 10.0.0.98" root@k8s-etcd1:~# for ip in ${NODE_IPS};do ETCDCTL_API=3 /usr/bin/etcdctl --endpoints=https://${ip}:2379 --cacert=/etc/kubernetes/ssl/ca.pem --cert=/etc/kubernetes/ssl/etcd.pem --key=/etc/kubernetes/ssl/etcd-key.pem endpoint health; done https://10.0.0.78:2379 is healthy: successfully committed proposal: took = 6.618167ms https://10.0.0.88:2379 is healthy: successfully committed proposal: took = 6.315989ms https://10.0.0.98:2379 is healthy: successfully committed proposal: took = 6.916101ms # 部署运行时 docker 1 、修改配置文件,设置我们的harbor镜像仓库 root@k8s-master1:/etc/kubeasz# vim clusters/k8s-01/config.yml # [docker]信任的HTTP仓库 INSECURE_REG: '["127.0.0.1/8","10.0.0.81"]' # [containerd]基础容器镜像 (这里修改为上传docker后的镜像,node下载会加速下载) SANDBOX_IMAGE: "10.0.0.81/baseimages/pause-amd64:3.4.1" root@k8s-master1:/etc/kubeasz# docker pull easzlab/pause-amd64:3.4.1 root@k8s-master1:/etc/kubeasz# docker tag docker.io/easzlab/pause-amd64:3.4.1 10.0.0.81/baseimages/pause-amd64:3.4.1 root@k8s-master1:/etc/kubeasz# docker push 10.0.0.81/baseimages/pause-amd64:3.4.1 - 在node节点测试是否可以下载镜像 2、$所有服务器都需要有这个文件,然后重启docker,默认没有在master节点安装 ,因为已经安装docker了 root@k8s-master1:/etc/kubeasz# cat /etc/docker/daemon.json { "data-root": "/var/lib/docker", "exec-opts": ["native.cgroupdriver=systemd"], "insecure-registries": ["127.0.0.1/8","10.0.0.81"], root@k8s-node1:~# scp /etc/docker/daemon.json 10.0.0.18:/etc/docker/ root@k8s-master1:/etc/kubeasz# systemctl restart docker.service 3、 登录harbor测试是否可以登录,账号admin - 然后开始安装docker,软连接报错没事 root@k8s-master1:/etc/kubeasz# ./ezctl setup k8s-01 03 root@k8s-master1:/etc/kubeasz# docker login 10.0.0.81 # 添加master master启动之后 负载均衡就可以访问了 root@k8s-master1:/etc/kubeasz# ./ezctl setup k8s-01 04 - 起来之后就可以访问验证kubectl命令是否可以用,查看状态 Ready 是因为mmaster不运行容器,所以调度关掉了 root@k8s-master1:/etc/kubeasz# kubectl get node NAME STATUS ROLES AGE VERSION 10.0.0.18 Ready,SchedulingDisabled master 111s v1.21.0 10.0.0.28 Ready,SchedulingDisabled master 112s v1.21.0 10.0.0.38 Ready,SchedulingDisabled master 112s v1.21.0 # 添加node root@k8s-master1:/etc/kubeasz# ./ezctl setup k8s-01 05 这个文件会像nginx一样动态生成,监听在我们本机的6443端口 root@k8s-master1:/etc/kubeasz# cat roles/ex-lb/templates/l4lb.conf.j2 root@k8s-node1:~# cat /etc/kube-lb/conf/kube-lb.conf upstream backend { server 10.0.0.18:6443 max_fails=2 fail_timeout=3s; server 10.0.0.28:6443 max_fails=2 fail_timeout=3s; server 10.0.0.38:6443 max_fails=2 fail_timeout=3s; 这个时候就可以访问node节点了 root@k8s-master1:/etc/kubeasz# kubectl get node NAME STATUS ROLES AGE VERSION 10.0.0.18 Ready,SchedulingDisabled master 14h v1.21.0 10.0.0.28 Ready,SchedulingDisabled master 14h v1.21.0 10.0.0.38 Ready,SchedulingDisabled master 14h v1.21.0 10.0.0.48 Ready node 14h v1.21.0 10.0.0.58 Ready node 14h v1.21.0 10.0.0.68 Ready node 14h v1.21.0 - kubelet的service文件路径 cat /etc/systemd/system/kubelet.service # 部署网络组件calico 网络组件一定要定义好,生产环境一旦更改是无法更改的,除非迁移 查看他们的镜像是在哪儿下载的,服务器需要上外网 ,不然还需要提前传 root@k8s-master1:/etc/kubeasz# cat playbooks/06.network.yml root@k8s-master1:/etc/kubeasz# vim /etc/docker/daemon.json "data-root": "/var/lib/docker", "registry-mirrors": ["https://99162low.mirror.aliyuncs.com"], #添加阿里云的源,提高下载速度 - node节点手动下载镜像,也可以把master的镜像上传 node本地下载 #Master修改镜像 docker tag calico/node:v3.15.3 10.0.0.81/baseimages/calico-node:v3.15.3 docker tag calico/pod2daemon-flexvol:v3.15.3 10.0.0.81/baseimages/pod2daemon-flexvol:v3.15.3 docker tag calico/cni:v3.15.3 10.0.0.81/baseimages/calico-cni:v3.15.3 docker tag calico/kube-controllers:v3.15.3 10.0.0.81/baseimages/kube-controllers:v3.15.3 docker push 10.0.0.81/m44/calico-node:v3.15.3 docker login 10.0.0.81 #上传仓库 docker push 10.0.0.81/m44/calico-node:v3.15.3 docker push 10.0.0.81/m44/pod2daemon-flexvol:v3.15.3 docker push 10.0.0.81/m44/calico-cni:v3.15.3 docker push 10.0.0.81/m44/kube-controllers:v3.15.3 - 把maser的calico修改为本地镜像,这样在node节点下载就会很快 root@k8s-master1:/etc/kubeasz# vim roles/calico/templates/calico-v3.15.yaml.j2 image: 10.0.0.81/m44/kube-controllers:v3.15.3 image: 10.0.0.81/m44/calico-cni:v3.15.3 image: 10.0.0.81/m44/pod2daemon-flexvol:v3.15.3 image: 10.0.0.81/m44/calico-node:v3.15.3 - 如果部署calico网络不通需要查看网段是否和本机地址一致 root@k8s-master1:/etc/kubeasz# cat clusters/k8s-01/hosts'grep CLUSTER_CIDR CLUSTER_CIDR="10.200.0.0/16" - 开始部署calico root@k8s-master1:/etc/kubeasz# ./ezctl setup k8s-01 06 - 部署完成之测试 root@k8s-master1:/etc/kubeasz# kubectl get node NAME STATUS ROLES AGE VERSION 10.0.0.18 Ready,SchedulingDisabled master 21m v1.21.0 10.0.0.28 Ready,SchedulingDisabled master 21m v1.21.0 10.0.0.38 Ready,SchedulingDisabled master 21m v1.21.0 10.0.0.48 Ready node 17m v1.21.0 10.0.0.58 Ready node 17m v1.21.0 root@k8s-master1:/etc/kubeasz# calicoctl node status #查看网络状态,这个时候node节点是互联状态(状态是 Established) Calico process is running. IPv4 BGP status +--------------+-------------------+-------+----------+-------------+ ' PEER ADDRESS ' PEER TYPE ' STATE ' SINCE ' INFO ' +--------------+-------------------+-------+----------+-------------+ ' 10.0.0.48 ' node-to-node mesh ' up ' 16:29:45 ' Established ' ' 10.0.0.58 ' node-to-node mesh ' up ' 16:29:48 ' Established ' ' 10.0.0.28 ' node-to-node mesh ' up ' 16:29:50 ' Established ' ' 10.0.0.38 ' node-to-node mesh ' up ' 16:29:50 ' Established ' +--------------+-------------------+-------+----------+-------------+ IPv6 BGP status No IPv6 peers found. #创建容器测试网络是否正常 kubectl run net-test1 --image=alpine sleep 360000 # 状态正常就可以 (NODE 查看调度在那台服务器上) kubectl get pod -o wide # 进入容器查看网络是否正常 (容器网段就是指定的10.200 网段) kubectl exec -it net-test1 sh / # ping (另外一个启动容器的IP 是否可以通讯) * **这个时候我们的k8s集群已经部署完成!如果calico网络插件出现轮训启动失败,可以参照之前文章Trojan代理去下载镜像 本人就踩过这样的坑,安装3遍都是calico无法启动,辗转反侧,彻夜难眠终于找到了这个好用的代理,下载速度贼快!!**