K8s-系統初始化.01
上一篇:K8s-元件版本和配置策略.00
叢集機器(本文使用華為雲伺服器,CentOS 7.5系統)
-
k8s-master-0001 172.27.129.101
-
k8s-master-0002 172.27.129.102
-
k8s-master-0003 172.27.129.103
-
k8s-etcd-0001 172.27.129.104
-
k8s-etcd-0002 172.27.129.105
-
k8s-etcd-0003 172.27.129.106
-
k8s-node-0001 172.27.129.107
-
k8s-node-0002 172.27.129.108
-
k8s-node-0003 172.27.129.109
-
本文件中的 etcd 叢集、master 節點、worker 節點使用共9臺機器。
主機名
設定永久主機名稱,然後重新登入,按照叢集機器分別改名:
$ sudo hostnamectl set-hostname k8s-master-0001 # 將 k8s-master-0001 替換為當前主機
修改每臺機器的 /etc/hosts
檔案,新增主機名和 IP 的對應關係:
$ grep k8s /etc/hosts
k8s-master-0001 172.27.129.101
k8s-master-0002 172.27.129.102
k8s-master-0003 172.27.129.103
k8s-etcd-0001 172.27.129.104
k8s-etcd-0002 172.27.129.105
k8s-etcd-0003 172.27.129.106
k8s-node-0001 172.27.129.107
k8s-node-0002 172.27.129.108
k8s-node-0003 172.27.129.109
新增 k8s 和 docker 賬戶
在每臺機器上新增 k8s 賬戶,可以無密碼 sudo:
$ sudo useradd -m k8s $ sudo sh -c 'echo 123456 | passwd k8s --stdin' # 為 k8s 賬戶設定密碼 $ sudo visudo $ sudo grep '%wheel.*NOPASSWD: ALL' /etc/sudoers %wheel ALL=(ALL) NOPASSWD: ALL $ sudo gpasswd -a k8s wheel
在每臺機器上新增 docker 賬戶,將 k8s 賬戶新增到 docker 組中,同時配置 dockerd 引數:
$ sudo useradd -m docker $ sudo gpasswd -a k8s docker $ sudo mkdir -p /etc/docker/ $ cat /etc/docker/daemon.json { "registry-mirrors": ["https://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn"], "max-concurrent-downloads": 20 }
無密碼 ssh 登入其它節點
如果沒有特殊指明,本文件的所有操作均在 k8s-master-0001 節點上執行,然後遠端分發檔案和執行命令。
設定 kube-node1 可以無密碼登入所有節點的 k8s 和 root 賬戶:
[[email protected] k8s]$ ssh-keygen -t rsa [[email protected] k8s]$ ssh-copy-id [email protected] [[email protected] k8s]$ ssh-copy-id [email protected] [[email protected] k8s]$ ssh-copy-id [email protected] [[email protected] k8s]$ ssh-copy-id [email protected] [[email protected] k8s]$ ssh-copy-id [email protected] [[email protected] k8s]$ ssh-copy-id [email protected] [[email protected] k8s]$ ssh-copy-id [email protected] [[email protected] k8s]$ ssh-copy-id [email protected] [[email protected] k8s]$ ssh-copy-id [email protected] [[email protected] k8s]$ ssh-copy-id [email protected] [[email protected] k8s]$ ssh-copy-id [email protected] [[email protected] k8s]$ ssh-copy-id [email protected] [[email protected] k8s]$ ssh-copy-id [email protected] [[email protected] k8s]$ ssh-copy-id [email protected] [[email protected] k8s]$ ssh-copy-id [email protected] [[email protected] k8s]$ ssh-copy-id [email protected] [[email protected] k8s]$ ssh-copy-id [email protected] [[email protected] k8s]$ ssh-copy-id [email protected]
將可執行檔案路徑 /opt/k8s/bin 新增到 PATH 變數中
在每臺機器上新增環境變數:
$ sudo sh -c "echo 'PATH=/opt/k8s/bin:$PATH:$HOME/bin:$JAVA_HOME/bin' >>/root/.bashrc" $ echo 'PATH=/opt/k8s/bin:$PATH:$HOME/bin:$JAVA_HOME/bin' >>~/.bashrc
$ PATH=/opt/k8s/bin:$PATH:$HOME/bin:$JAVA_HOME/bin
安裝依賴包
在每臺機器上安裝依賴包:
CentOS:
$ sudo yum install -y epel-release conntrack ipvsadm ipset jq sysstat curl iptables libseccomp
Ubuntu:
$ sudo apt-get install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp
- ipvs 依賴 ipset;
關閉防火牆
在每臺機器上關閉防火牆:
$ sudo systemctl stop firewalld $ sudo systemctl disable firewalld $ sudo iptables -F && sudo iptables -X && sudo iptables -F -t nat && sudo iptables -X -t nat $ sudo iptables -P FORWARD ACCEPT
關閉 swap 分割槽
如果開啟了 swap 分割槽,kubelet 會啟動失敗(可以通過將引數 --fail-swap-on 設定為 false 來忽略 swap on),故需要在每臺機器上關閉 swap 分割槽:
$ sudo swapoff -a
為了防止開機自動掛載 swap 分割槽,可以註釋 /etc/fstab
中相應的條目:
$ sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab #如無,可忽略
關閉 SELinux
關閉 SELinux,否則後續 K8S 掛載目錄時可能報錯 Permission denied
:
$ sudo setenforce 0 $ grep SELINUX /etc/selinux/config SELINUX=disabled
- 修改配置檔案,永久生效;
關閉 dnsmasq (可選)
linux 系統開啟了 dnsmasq 後(如 GUI 環境),將系統 DNS Server 設定為 127.0.0.1,這會導致 docker 容器無法解析域名,需要關閉它:
$ sudo service dnsmasq stop $ sudo systemctl disable dnsmasq
載入核心模組
$ sudo modprobe br_netfilter $ sudo modprobe ip_vs
設定系統引數
$ 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 vm.swappiness=0 vm.overcommit_memory=1 vm.panic_on_oom=0 fs.inotify.max_user_watches=89100 fs.file-max=52706963 fs.nr_open=52706963 net.ipv6.conf.all.disable_ipv6=1 net.netfilter.nf_conntrack_max=2310720 EOF $ sudo mv kubernetes.conf /etc/sysctl.d/kubernetes.conf $ sudo sysctl -p /etc/sysctl.d/kubernetes.conf $ sudo mount -t cgroup -o cpu,cpuacct none /sys/fs/cgroup/cpu,cpuacct # 如無,可忽略
- tcp_tw_recycle 和 Kubernetes 的 NAT 衝突,必須關閉 ,否則會導致服務不通;
- 關閉不使用的 IPV6 協議棧,防止觸發 docker BUG;
設定系統時區
$ # 調整系統 TimeZone
$ sudo timedatectl set-timezone Asia/Shanghai
$ # 將當前的 UTC 時間寫入硬體時鐘
$ sudo timedatectl set-local-rtc 0
$ # 重啟依賴於系統時間的服務
$ sudo systemctl restart rsyslog
$ sudo systemctl restart crond
更新系統時間
$ sudo ntpdate cn.pool.ntp.org
建立目錄
在每臺機器上建立目錄:
$ sudo mkdir -p /opt/k8s/bin && chown -R k8s /opt/k8s $ sudo mkdir -p /etc/kubernetes/cert && chown -R k8s /etc/kubernetes $ sudo mkdir -p /etc/etcd/cert && chown -R k8s /etc/etcd/cert $ sudo mkdir -p /var/lib/etcd && chown -R k8s /etc/etcd/cert
修改和分發叢集環境變數定義指令碼
後續的部署步驟將使用 environment.sh 中定義的全域性環境變數,請根據自己的機器、網路情況修改。
然後,把全域性變數定義指令碼拷貝到所有節點的 /opt/k8s/bin
目錄:
source environment.sh for colony_ip in 172.27.129.{1..9} do echo ">>> ${colony_ip}" scp environment.sh [email protected]${colony_ip}:/opt/k8s/bin/ ssh [email protected]${colony_ip} "chmod +x /opt/k8s/bin/*"