簡介
本系列文檔將介紹如何使用二進制部署
Kubernetes v1.15.6
集群的所有部署,而不是使用自動化部署(kubeadm
)集群。在部署過程中,將詳細列出各個組件啟動參數,以及相關配置說明。
組件版本
- Kubernetes 1.15.6 GitHub 下載地址
- Docker 18.09 (使用yum安裝)
- Etcd 3.3.13 GitHub 下載地址
- Flanneld 0.11.0 GitHub 下載地址
組件說明
kube-apiserver
- 使用節點本地Nginx 4層透明代理實現高可用 (也可以使用haproxy,只是起到代理apiserver的作用)
- 關閉非安全端口8080和匿名訪問
- 使用安全端口6443接受https請求
- 嚴格的認知和授權策略 (x509、token、rbac)
- 開啟bootstrap token認證,支持kubelet TLS bootstrapping;
- 使用https訪問kubelet、etcd
kube-controller-manager
- 3節點高可用 (在k8s中,有些組件需要選舉,所以使用奇數為集群高可用方案)
- 關閉非安全端口,使用10252接受https請求
- 使用kubeconfig訪問apiserver的安全扣
- 使用approve kubelet證書簽名請求(CSR),證書過期后自動輪轉
- 各controller使用自己的ServiceAccount訪問apiserver
kube-scheduler
- 3節點高可用;
- 使用kubeconfig訪問apiserver安全端口
kubelet
- 使用kubeadm動態創建bootstrap token
- 使用TLS bootstrap機制自動生成client和server證書,過期后自動輪轉
- 在kubeletConfiguration類型的JSON文件配置主要參數
- 關閉只讀端口,在安全端口10250接受https請求,對請求進行認真和授權,拒絕匿名訪問和非授權訪問
- 使用kubeconfig訪問apiserver的安全端口
kube-proxy
- 使用kubeconfig訪問apiserver的安全端口
- 在KubeProxyConfiguration類型JSON文件配置為主要參數
- 使用ipvs代理模式
集群插件
- DNS 使用功能、性能更好的coredns
- 網絡 使用Flanneld 作為集群網絡插件
初始化環境
所有機器均使用的是 CentOS-7.7 mini
的最小化安裝。
集群機器
主機名 | 角色 | IP | 系統版本 | 內核版本 |
---|---|---|---|---|
node01.k8s.com | master | 10.0.20.11 | CentOS 7.7 | 5.4.1-1.el7.elrepo.x86_64 |
node02.k8s.com | master | 10.0.20.12 | CentOS 7.7 | 5.4.1-1.el7.elrepo.x86_64 |
node03.k8s.com | master | 10.0.20.13 | CentOS 7.7 | 5.4.1-1.el7.elrepo.x86_64 |
node04.k8s.com | node | 10.0.20.1 4 | CentOS 7.7 | 5.4.1-1.el7.elrepo.x86_64 |
配置主機名
所有機器設置永久主機名
hostnamectl set-hostname node01.k8s.com
DNS 配置
本文設計使用到內網 DNS
,或者手動寫 hosts
都可以。
解析操作使用以下方法二選一
方法一、配置 hosts
文件
把一下內容寫入到所有機器中
10.0.20.11 node01 node01.k8s.com
10.0.20.12 node02 node02.k8s.com
10.0.20.13 node03 node03.k8s.com
10.0.20.14 node04 node04.k8s.com
方法二、配置 DNS 服務
參考 CentOS 7 安裝 bind 服務 實現內網DNS
按照上面的操作配置好DNS后,修改私有機器的DNS
地址,並配置查找域
[root@node01 ~]# cat /etc/resolv.conf
nameserver 10.0.20.8 # 這是我的bind服務器
search k8s.com # 這里配置域名,方便使用主機名直接解析
按照上面配置后效果如下:
[root@node01 ~]# ping -c 1 node01
PING node01.k8s.com (10.0.20.11) 56(84) bytes of data.
64 bytes from node01.k8s.com (10.0.20.11): icmp_seq=1 ttl=64 time=0.042 ms
[root@node01 ~]# ping -c 1 node02
PING node02.k8s.com (10.0.20.12) 56(84) bytes of data.
64 bytes from 10.0.20.12 (10.0.20.12): icmp_seq=1 ttl=64 time=0.204 ms
當直接 ping node01
類似於這種時,則會自動填充node01.k8s.com
。
更換yum源
更換為阿里雲的 Base 源和 epel 源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
增加 docker-ce
阿里雲源
[root@node01 yum.repos.d]# cat docker-ce.repo
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
[docker-ce-stable-debuginfo]
name=Docker CE Stable - Debuginfo $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/debug-$basearch/stable
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
[docker-ce-stable-source]
name=Docker CE Stable - Sources
beurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/source/stable
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
[docker-ce-edge]
name=Docker CE Edge - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/$basearch/edge
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
[docker-ce-edge-debuginfo]
name=Docker CE Edge - Debuginfo $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/debug-$basearch/edge
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
[docker-ce-edge-source]
name=Docker CE Edge - Sources
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/source/edge
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
[docker-ce-test]
name=Docker CE Test - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/$basearch/test
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
[docker-ce-test-debuginfo]
name=Docker CE Test - Debuginfo $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/debug-$basearch/test
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
[docker-ce-test-source]
name=Docker CE Test - Sources
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/source/test
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
[docker-ce-nightly]
name=Docker CE Nightly - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/$basearch/nightly
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
[docker-ce-nightly-debuginfo]
name=Docker CE Nightly - Debuginfo $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/debug-$basearch/nightly
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
[docker-ce-nightly-source]
name=Docker CE Nightly - Sources
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/source/nightly
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
安裝依賴包
因為是最小化系統安裝,需要安裝常規的軟件包
上面配置好了yum源,下面直接安裝即可
yum install -y conntrack ipvsadm ipset jq iptables curl sysstat libseccomp wget vim lrzsz tree telnet wget lsof dos2unix traceroute unzip zip bind-utils
設置免秘鑰
為了方便之后的操作,在node01
上配置連接其他機器的免秘鑰登陸操作
安裝expect
yum install -y expect
創建秘鑰
ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa
分發公鑰
這里我使用的
root
密碼是123456
,如有不同,請自行更換
for i in node01 node02 node03 node04;do
expect -c "
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@$i
expect {
\"*yes/no*\" {send \"yes\r\"; exp_continue}
\"*password*\" {send \"123456\r\"; exp_continue}
\"*Password*\" {send \"123456\r\";}
} "
done
更新PATH變量
本次的k8s軟件包的目錄全部存放在/opt下
[root@node01 ~]# echo 'PATH=/opt/k8s/bin:$PATH' >>/etc/profile
[root@node01 ~]# source /etc/profile
[root@node01 ~]# env|grep PATH
PATH=/opt/k8s/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
配置 chrony
時間同步
首先先設置時區
將硬件時鍾調整為與本地時鍾一致, 0 為設置為 UTC 時間
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 或者
timedatectl set-timezone Asia/Shanghai
安裝
yum install chrony -y
修改配置如下
[root@node01 ~]# egrep -v '^#|^$' /etc/chrony.conf
server time4.aliyun.com iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
logdir /var/log/chrony
啟動並設置開機自啟
[root@node01 ~]# systemctl start chronyd
[root@node01 ~]# systemctl enable chronyd
查看時間同步狀態
[root@node01 ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* 203.107.6.88 2 8 377 115 -268us[ -318us] +/- 15ms
當看到IP地址前面有個*
號的時候,表示同步成功
關閉防火牆 selinx 以及swap分區
systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat
iptables -P FORWARD ACCEPT
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
#如果開啟了swap分區,kubelet會啟動失敗(可以通過設置參數——-fail-swap-on設置為false)
關閉無用的服務
systemctl disable NetworkManager
systemctl disable postfix
升級內核
請參考文章 Centos 7.x 內核升級
加載內支持ipvs
使用systemd-modules-load加載內核模塊
cat > /etc/rc.local << EOF
modprobe ip_vs_rr
modprobe br_netfilter
EOF
cat > /etc/modules-load.d/ipvs.conf << EOF
ip_vs_rr
br_netfilter
EOF
systemctl enable --now systemd-modules-load.service
優化內核參數
cat > kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
vm.swappiness=0 # 禁止使用 swap 空間,只有當系統 OOM 時才允許使用它
vm.overcommit_memory=1 # 不檢查物理內存是否夠用
vm.panic_on_oom=0 # 開啟 OOM
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
關閉IPV6,防止觸發Docker BUG
創建相關目錄
mkdir -p /opt/k8s/{bin,work} /etc/{kubernetes,etcd}/cert
#在所有節點上執行,因為flanneld是在所有節點運行的
設置分發腳本參數
后續所有的使用環境變量都定義在environment.sh中,需要根據個人機器及網絡環境修改。並且需要拷貝到所有節點的/opt/k8s/bin目錄下
#!/usr/bin/bash
# 生成 EncryptionConfig 所需的加密 key
export ENCRYPTION_KEY=$(head -c 32 /dev/urandom | base64)
# 集群各機器 IP 數組
export NODE_IPS=( 10.0.20.11 10.0.20.12 10.0.20.13 10.0.20.14 )
# 集群各 IP 對應的主機名數組
export NODE_NAMES=( node01 node02 node03 node04 )
# 集群MASTER機器 IP 數組
export MASTER_IPS=( 10.0.20.11 10.0.20.12 10.0.20.13 )
# 集群所有的master Ip對應的主機
export MASTER_NAMES=( node01 node02 node03 )
# etcd 集群服務地址列表
export ETCD_ENDPOINTS="https://etcd01.k8s.com:2379,https://etcd02.k8s.com:2379,https://etcd03.k8s.com:2379"
# etcd 集群間通信的 IP 和端口
export ETCD_NODES="etcd01=https://etcd01.k8s.com:2380,etcd02=https://etcd02.k8s.com:2380,etcd03=https://etcd03.k8s.com:2380"
# etcd 集群各 主機名 數組
export NODE_NAMES=( etcd01 etcd02 etcd03 )
# etcd 集群所有node ip
export ETCD_IPS=( 10.0.20.11 10.0.20.12 10.0.20.13 )
# kube-apiserver 的反向代理(kube-nginx)地址端口
export KUBE_APISERVER="https://vip.k8s.com: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"
# 服務網段,部署前路由不可達,部署后集群內路由可達(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="1024-32767"
# flanneld 網絡配置前綴
export FLANNEL_ETCD_PREFIX="/kubernetes/network"
# 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
建議
如果使用的是 虛擬機
,那么此時應該關機后,創建一個快照
。
參考鏈接