如果沒有特殊說明,需要在所有節點上執行初始化操作。
集群規划
本次部署采用三個節點,混合部署 etcd、master 集群和 worker 集群。
三台機器操作系統為 Centos7.6,單網卡。
- zhaoyixin-k8s-01:192.168.16.8
- zhaoyixin-k8s-02:192.168.16.10
- zhaoyixin-k8s-03:192.168.16.6
設置主機名
# 使用 zhaoyixin-k8s-01 作為當前的主機名
hostnamectl set-hostname zhaoyixin-k8s-01
在每台機器的/etc/hosts
文件中添加本地DNS解析:
cat >> /etc/hosts <<EOF
192.168.16.8 zhaoyixin-k8s-01
192.168.16.10 zhaoyixin-k8s-02
192.168.16.6 zhaoyixin-k8s-03
EOF
退出並重新登錄 root 賬號,可以看到主機名已更改。
添加節點信任,只需在 zhaoyixin-k8s-01 節點上進行,設置 root 賬戶可以無密碼登錄所有結點:
ssh-keygen -t rsa
ssh-copy-id root@zhaoyixin-k8s-01
ssh-copy-id root@zhaoyixin-k8s-02
ssh-copy-id root@zhaoyixin-k8s-03
安裝依賴包
更新 PATH 變量
echo 'PATH=/opt/k8s/bin:$PATH' >>/root/.bashrc
source /root/.bashrc
/opt/k8s/bin
目錄用來保存下載安裝的程序。
yum install -y epel-release
yum install -y chrony conntrack ipvsadm ipset jq iptables curl sysstat libseccomp wget socat git
- kube-proxy 采用 ipvs 模式,ipvsadm 為 ipvs 的管理工具;
- etcd 集群各機器需要時間同步,chrony 用於系統時間同步;
關閉部分服務
systemctl stop postfix && systemctl disable postfix
關閉防火牆,清理防火牆規則,設置默認轉發策略:
systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat
iptables -P FORWARD ACCEPT
關閉 swap 分區,否則kubelet 會啟動失敗(可以設置 kubelet 啟動參數 --fail-swap-on 為false 關閉 swap 檢查):
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
關閉 SELinux,否則 kubelet 掛載目錄時可能報錯 Permission denied
:
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
優化內核參數
cat > kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
net.ipv4.neigh.default.gc_thresh1=1024
net.ipv4.neigh.default.gc_thresh1=2048
net.ipv4.neigh.default.gc_thresh1=4096
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
cp kubernetes.conf /etc/sysctl.d/kubernetes.conf
sysctl -p /etc/sysctl.d/kubernetes.conf
關閉 tcp_tw_recycle,否則與 NAT 沖突,可能導致服務不通;
設置時鍾同步
設置系統時區
timedatectl set-timezone Asia/Shanghai
設置系統時鍾同步
systemctl enable chronyd
systemctl start chronyd
查看同步狀態
timedatectl status
# 輸出
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
System clock synchronized: yes
,表示時鍾已同步;NTP service: active
,表示開啟了時鍾同步服務。
將當前的 UTC 時間寫入硬件時鍾,並重啟依賴系統時間的服務
timedatectl set-local-rtc 0
systemctl restart rsyslog
systemctl restart crond
分發集群配置參數腳本
創建目錄
mkdir -p /opt/k8s/{bin,work} /etc/{kubernetes,etcd}/cert
后續使用的環境變量都定義在文件 environment.sh 中(可以在文章最后查看文件內容),請根據自己的機器、網絡情況修改。然后拷貝到所有節點:
source environment.sh # 先修改腳本文件
for node_ip in ${NODE_IPS[@]}
do
echo ">>> ${node_ip}"
scp environment.sh root@${node_ip}:/opt/k8s/bin/
ssh root@${node_ip} "chmod +x /opt/k8s/bin/*"
done
升級內核
CentOS 7.x 系統自帶的 3.10.x 內核存在一些 Bugs,導致運行的 Docker、Kubernetes 不穩定,現在將內核升級到 4.4.X 以上。
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
# 安裝完成后檢查 /boot/grub2/grub.cfg 中對應內核 menuentry 中是否包含 initrd16 配置,如果沒有,再安裝一次!
yum --enablerepo=elrepo-kernel install -y kernel-lt
# 設置開機從新內核啟動
grub2-set-default 0
重啟機器:
sync
reboot
uname -r # 查看內核是否升級成功
參考
opsnull/follow-me-install-kubernetes-cluster
環境變量文件
environment.sh
#!/usr/bin/bash
# 生成 EncryptionConfig 所需的加密 key
export ENCRYPTION_KEY=$(head -c 32 /dev/urandom | base64)
# 集群各機器 IP 數組
export NODE_IPS=(192.168.16.8 192.168.16.10 192.168.16.6)
# 集群各 IP 對應的主機名數組
export NODE_NAMES=(zhaoyixin-k8s-01 zhaoyixin-k8s-02 zhaoyixin-k8s-03)
# etcd 集群服務地址列表
export ETCD_ENDPOINTS="https://192.168.16.8:2379,https://192.168.16.10:2379,https://192.168.16.6:2379"
# etcd 集群間通信的 IP 和端口
export ETCD_NODES="zhaoyixin-k8s-01=https://192.168.16.8:2380,zhaoyixin-k8s-02=https://192.168.16.10:2380,zhaoyixin-k8s-03=https://192.168.16.6:2380"
# kube-apiserver 的反向代理(kube-nginx)地址端口
export KUBE_APISERVER="https://127.0.0.1:8443"
# 節點間互聯網絡接口名稱
export IFACE="eth0"
# etcd 數據目錄
export ETCD_DATA_DIR="/data/k8s/etcd/data"
# etcd WAL 目錄,建議是 SSD 磁盤分區,或者和 ETCD_DATA_DIR 不同的磁盤分區
export ETCD_WAL_DIR="/data/k8s/etcd/wal"
# k8s 各組件數據目錄
export K8S_DIR="/data/k8s/k8s"
## DOCKER_DIR 和 CONTAINERD_DIR 二選一
# docker 數據目錄
export DOCKER_DIR="/data/k8s/docker"
# containerd 數據目錄
export CONTAINERD_DIR="/data/k8s/containerd"
## 以下參數一般不需要修改
# TLS Bootstrapping 使用的 Token,可以使用命令 head -c 16 /dev/urandom | od -An -t x | tr -d ' ' 生成
BOOTSTRAP_TOKEN="41f7e4ba8b7be874fcff18bf5cf41a7c"
# 最好使用 當前未用的網段 來定義服務網段和 Pod 網段
# 服務網段,部署前路由不可達,部署后集群內路由可達(kube-proxy 保證)
SERVICE_CIDR="10.254.0.0/16"
# Pod 網段,建議 /16 段地址,部署前路由不可達,部署后集群內路由可達(flanneld 保證)
CLUSTER_CIDR="172.30.0.0/16"
# 服務端口范圍 (NodePort Range)
export NODE_PORT_RANGE="30000-32767"
# kubernetes 服務 IP (一般是 SERVICE_CIDR 中第一個IP)
export CLUSTER_KUBERNETES_SVC_IP="10.254.0.1"
# 集群 DNS 服務 IP (從 SERVICE_CIDR 中預分配)
export CLUSTER_DNS_SVC_IP="10.254.0.2"
# 集群 DNS 域名(末尾不帶點號)
export CLUSTER_DNS_DOMAIN="cluster.local"
# 將二進制目錄 /opt/k8s/bin 加到 PATH 中
export PATH=/opt/k8s/bin:$PATH