目录 组件版本和配置策略 组件版本 主要配置策略 1. 系统初始化 2. 创建CA根证书和密钥 3. 部署etcd集群 4. 部署flannel网络 5. 部署kubectl命令行工具 6. 部署master节点 6.01 部署高可用组件 6.02 部署 kube-apiserver 组件 6.03 部署高可用kube-controller-manager 集群 6.04 部署高可用 kube-scheduler 集群 master集群已部署完毕! 回到顶部 组件版本和配置策略 组件版本 Kubernetes 1.16.2 Docker 19.03-ce Etcd 3.3.17 https://github.com/etcd-io/etcd/releases/ Flanneld 0.11.0 https://github.com/coreos/flannel/releases/ 插件: 镜像仓库: docker registry harbor 主要配置策略 kube-apiserver: 使用 keepalived 和 haproxy 实现 3 节点高可用; 关闭非安全端口 8080 和匿名访问; 在安全端口 6443 接收 https 请求; 严格的认证和授权策略 (x509、token、RBAC); 开启 bootstrap token 认证,支持 kubelet TLS bootstrapping; 使用 https 访问 kubelet、etcd,加密通信; kube-controller-manager: 3 节点高可用;主备备 关闭非安全端口,在安全端口 10252 接收 https 请求; 使用 kubeconfig 访问 apiserver 的安全端口; 自动 approve kubelet 证书签名请求 (CSR),证书过期后自动轮转; 各 controller 使用自己的 ServiceAccount 访问 apiserver; kube-scheduler: 3 节点高可用;主备备 使用 kubeconfig 访问 apiserver 的安全端口; kubelet: 使用 kubeadm 动态创建 bootstrap token,也可以在 apiserver 中静态配置; 使用 TLS bootstrap 机制自动生成 client 和 server 证书,过期后自动轮转; 在 KubeletConfiguration 类型的 JSON 文件配置主要参数; 关闭只读端口,在安全端口 10250 接收 https 请求,对请求进行认证和授权,拒绝匿名访问和非授权访问; 使用 kubeconfig 访问 apiserver 的安全端口; kube-proxy: 使用 kubeconfig 访问 apiserver 的安全端口; 在 KubeProxyConfiguration 类型的 JSON 文件配置主要参数; 使用 ipvs 代理模式; 集群插件: 回到顶部 1. 系统初始化 1.01 系统环境&&基本环境配置 [root@localhost ~]# uname -a Linux localhost.localdomain 4.18.0-80.11.2.el8_0.x86_64 #1 SMP Tue Sep 24 11:32:19 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 8.0.1905 (Core) 1.02 修改各个节点的对应hostname, 并分别写入/etc/hosts hostnamectl set-hostname k8s-master01 ... # 写入hosts--> 注意是 >> 表示不改变原有内容追加! cat>> /etc/hosts <selinux=disabled 需重启生效! setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config # 关闭swap --->注释掉swap那一行, 需重启生效! swapoff -a && sed -i '/ swap / s/^\(.*\)$/# \1/g' /etc/fstab 1.05 所有节点设置时间同步 timedatectl set-timezone Asia/Shanghai timedatectl set-local-rtc 0 yum install chrony -y systemctl enable chronyd && systemctl start chronyd && systemctl status chronyd 1.06 调整内核参数, k8s必备参数! # 先加载模块 modprobe br_netfilter cat> kubernetes.conf <> /etc/profile.d/k8s.sh" source /etc/profile.d/k8s.sh 1.08 无密码 ssh 登录其它节点(为了部署方便!!!) 生成秘钥对 [root@k8s-master01 ~]# ssh-keygen 将自己的公钥发给其他服务器 [root@k8s-master01 ~]# ssh-copy-id root@k8s-master01 [root@k8s-master01 ~]# ssh-copy-id root@k8s-master02 [root@k8s-master01 ~]# ssh-copy-id root@k8s-master03 回到顶部 2. 创建CA根证书和密钥 为确保安全, kubernetes 系统各组件需要使用 x509 证书对通信进行加密和认证。 CA (Certificate Authority) 是自签名的根证书,用来签名后续创建的其它证书。 2.01 安装cfssl工具集 [root@k8s-master01 ~]# wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 [root@k8s-master01 ~]# mv cfssl_linux-amd64 /opt/k8s/bin/cfssl [root@k8s-master01 ~]# wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 [root@k8s-master01 ~]# mv cfssljson_linux-amd64 /opt/k8s/bin/cfssljson [root@k8s-master01 ~]# wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 [root@k8s-master01 ~]# mv cfssl-certinfo_linux-amd64 /opt/k8s/bin/cfssl-certinfo chmod +x /opt/k8s/bin/* 2.02 创建根证书CA CA 证书是集群所有节点共享的,只需要创建一个CA证书,后续创建的所有证书都由它签名。 2.02.01 创建配置文件 CA 配置文件用于配置根证书的使用场景 (profile) 和具体参数 (usage,过期时间、服务端认证、客户端认证、加密等),后续在签名其它证书时需要指定特定场景。 [root@k8s-master01 ~]# cd /opt/k8s/cert/ [root@k8s-master01 cert]# cat> ca-config.json < ca-csr.json <>> ${master_ip}" scp /opt/k8s/cert/ca*.pem /opt/k8s/cert/ca-config.json root@${master_ip}:/opt/k8s/cert done [root@k8s-master01 cert]# bash /opt/k8s/script/scp_k8s_cacert.sh 192.168.2.201 192.168.2.202 192.168.2.203 回到顶部 3. 部署etcd集群 etcd 是基于Raft的分布式key-value存储系统,由CoreOS开发,常用于服务发现、共享配置以及并发控制(如leader选举、分布式锁等) kubernetes 使用 etcd 存储所有运行数据。所以部署三节点高可用! 3.01 下载二进制文件 [root@k8s-master01 ~]# wget https://github.com/etcd-io/etcd/releases/download/v3.3.17/etcd-v3.3.17-linux-amd64.tar.gz [root@k8s-master01 ~]# tar -xvf etcd-v3.3.17-linux-amd64.tar.gz 3.02 创建etcd证书和密钥 etcd集群要与k8s-->apiserver通信, 所以需要用证书签名验证! 3.02.01 创建证书签名请求 [root@k8s-master01 cert]# cat > /opt/etcd/cert/etcd-csr.json <>> ${master_ip}" scp /root/etcd-v3.3.17-linux-amd64/etcd* root@${master_ip}:/opt/etcd/bin ssh root@${master_ip} "chmod +x /opt/etcd/bin/*" scp /opt/etcd/cert/etcd*.pem root@${master_ip}:/opt/etcd/cert/ done [root@k8s-master01 ~]# bash /opt/k8s/script/scp_etcd.sh 192.168.2.201 192.168.2.202 192.168.2.203 3.03 创建etcd的systemd unit模板及etcd配置文件 创建etcd的systemd unit模板 [root@k8s-master01 ~]# vi /opt/etcd/etcd.service.template [Unit] Description=Etcd Server After=network.target After=network-online.target Wants=network-online.target Documentation=https://github.com/coreos [Service] User=root Type=notify WorkingDirectory=/opt/lib/etcd/ ExecStart=/opt/etcd/bin/etcd \ --data-dir=/opt/lib/etcd \ --name ##ETCD_NAME## \ --cert-file=/opt/etcd/cert/etcd.pem \ --key-file=/opt/etcd/cert/etcd-key.pem \ --trusted-ca-file=/opt/k8s/cert/ca.pem \ --peer-cert-file=/opt/etcd/cert/etcd.pem \ --peer-key-file=/opt/etcd/cert/etcd-key.pem \ --peer-trusted-ca-file=/opt/k8s/cert/ca.pem \ --peer-client-cert-auth \ --client-cert-auth \ --listen-peer-urls=https://##MASTER_IP##:2380 \ --initial-advertise-peer-urls=https://##MASTER_IP##:2380 \ --listen-client-urls=https://##MASTER_IP##:2379,http://127.0.0.1:2379 \ --advertise-client-urls=https://##MASTER_IP##:2379 \ --initial-cluster-token=etcd-cluster-0 \ --initial-cluster=etcd0=https://192.168.2.201:2380,etcd1=https://192.168.2.202:2380,etcd2=https://192.168.2.203:2380 \ --initial-cluster-state=new Restart=on-failure RestartSec=5 LimitNOFILE=65536 [Install] WantedBy=multi-user.target 本示例用脚本替换变量-->##ETCD_NAME##, ##MASTER_IP## WorkingDirectory 、 --data-dir:指定工作目录和数据目录为/opt/lib/etcd ,需在启动服务前创建这个目录; --name :指定各个节点名称,当 --initial-cluster-state 值为new时, --name的参数值必须位于--initial-cluster 列表中; --cert-file 、 --key-file:etcd server 与 client 通信时使用的证书和私钥; --trusted-ca-file:签名 client 证书的 CA 证书,用于验证 client 证书; --peer-cert-file 、 --peer-key-file:etcd 与 peer 通信使用的证书和私钥; --peer-trusted-ca-file:签名 peer 证书的 CA 证书,用于验证 peer 证书; 3.04 为各节点创建和分发etcd systemd unit文件 [root@k8s-master01 ~]# vi /opt/k8s/script/etcd_service.sh ETCD_NAMES=("etcd0" "etcd1" "etcd2") MASTER_IPS=("$1" "$2" "$3") #替换模板文件中的变量,为各节点创建systemd unit文件 for (( i=0; i < 3; i++ ));do sed -e "s/##ETCD_NAME##/${ETCD_NAMES[i]}/g" -e "s/##MASTER_IP##/${MASTER_IPS[i]}/g" /opt/etcd/etcd.service.template > /opt/etcd/etcd-${MASTER_IPS[i]}.service done #分发生成的systemd unit和etcd的配置文件: for master_ip in ${MASTER_IPS[@]};do echo ">>> ${master_ip}" scp /opt/etcd/etcd-${master_ip}.service root@${master_ip}:/etc/systemd/system/etcd.service done [root@k8s-master01 ~]# bash /opt/k8s/script/etcd_service.sh 192.168.2.201 192.168.2.202 192.168.2.203 3.05 启动etcd服务 [root@k8s-master01 ~]# vi /opt/k8s/script/etcd.sh MASTER_IPS=("$1" "$2" "$3") #启动 etcd 服务 for master_ip in ${MASTER_IPS[@]};do echo ">>> ${master_ip}" ssh root@${master_ip} "systemctl daemon-reload && systemctl enable etcd && systemctl start etcd" done #检查启动结果,确保状态为 active (running) for master_ip in ${MASTER_IPS[@]};do echo ">>> ${master_ip}" ssh root@${master_ip} "systemctl status etcd|grep Active" done #验证服务状态,输出均为healthy 时表示集群服务正常 for master_ip in ${MASTER_IPS[@]};do echo ">>> ${master_ip}" ETCDCTL_API=3 /opt/etcd/bin/etcdctl \ --endpoints=https://${master_ip}:2379 \ --cacert=/opt/k8s/cert/ca.pem \ --cert=/opt/etcd/cert/etcd.pem \ --key=/opt/etcd/cert/etcd-key.pem endpoint health done [root@k8s-master01 ~]# bash /opt/k8s/script/etcd.sh 192.168.2.201 192.168.2.202 192.168.2.203 回到顶部 4. 部署flannel网络 kubernetes要求集群内各节点(包括master节点)能通过Pod网段互联互通。flannel使用vxlan技术为各节点创建一个可以互通的Pod网络,使用的端口为UDP 8472,需要开放该端口(如公有云 AWS 等)。 flannel第一次启动时,从etcd获取Pod网段信息,为本节点分配一个未使用的 /24段地址,然后创建 flannel.1(也可能是其它名称) 接口。 flannel将分配的Pod网段信息写入/run/flannel/docker文件,docker后续使用这个文件中的环境变量设置docker0网桥。 4.01 下载flannel二进制文件 [root@k8s-master01 ~]# wget https://github.com/coreos/flannel/releases/download/v0.11.0/flannel-v0.11.0-linux-amd64.tar.gz [root@k8s-master01 ~]# mkdir flanneld [root@k8s-master01 ~]# tar -xvf flannel-v0.11.0-linux-amd64.tar.gz -C flanneld 4.02 创建flannel证书和密钥 flannel从etcd集群存取网段分配信息,而etcd集群启用了双向x509证书认证,所以需要flanneld 生成证书和私钥。 4.02.01 创建证书签名请求 [root@k8s-master01 ~]# cat > /opt/flanneld/cert/flanneld-csr.json <>> ${master_ip}" scp /root/flanneld/flanneld /root/flanneld/mk-docker-opts.sh ro