centos7 搭建 kubernetes1.16.7 叢集
環境:
- 作業系統:win10
- 虛拟機:virtual box
- linux發行版:CentOS7.9
- linux核心(使用uname -r檢視):3.10.0-957.el7.x86_64
- master和node節點通信的ip(master): 10.0.0.198
0.檢查配置
本次搭建的叢集共三個節點,包含一個主節點,兩個工作子節點:
節點 | 角色 | IP |
Node1 | Master | 10.0.0.198 |
Node2 | Woker | 10.0.0.199 |
Node3 | 10.0.0.200 |
根據官方推薦,節點可以是Ubuntu或CentOS作業系統,本次選擇使用CentOS 7。節點最低配置如下:
硬體 | 配置 |
記憶體 | >=2G |
CPU | >=2核 |
磁盤 | >=15G |
檢查 centos / hostname
# 在 master 節點和 worker 節點都要執行
cat /etc/redhat-release
# 此處 hostname 的輸出将會是該機器在 Kubernetes 叢集中的節點名字
# 不能使用 localhost 作為節點的名字
hostname
# 請使用 lscpu 指令,核對 CPU 資訊
# Architecture: x86_64 本安裝文檔不支援 arm 架構
# CPU(s): 2 CPU 核心數量不能低于 2
lscpu
虛拟機開通完成後, 為每個節點設定hosts及hostname
修改 hosts:
master/node1/node2
cat <<EOF >>/etc/hosts
10.0.0.198 master-1
10.0.0.199 node1
10.0.0.200 node2
EOF
修改 hostname
如果您需要修改 hostname,可執行如下指令:
# 修改 hostname
hostnamectl set-hostname your-new-host-name
# 檢視修改結果
hostnamectl status
# 設定 hostname 解析
echo "127.0.0.1 $(hostname)" >> /etc/hosts
master
hostnamectl set-hostname master-1
node1
hostnamectl set-hostname node1
node2
hostnamectl set-hostname node2
檢查網絡
kubelet使用的IP位址
-
指令中,可以知道機器的預設網卡,通常是ip route show
,如 default via 172.21.0.23 dev eth0eth0
-
指令中,可顯示預設網卡的 IP 位址,Kubernetes 将使用此 IP 位址與叢集内的其他節點通信,如ip address
172.17.216.80
- 所有節點上 Kubernetes 所使用的 IP 位址必須可以互通(無需 NAT 映射、無安全組或防火牆隔離)
1. 安裝docker-ce 18.09.9(所有機器)
所有安裝k8s的機器都需要安裝docker,指令如下:
# 在 master 節點和 worker 節點都要執行
# 安裝 docker
# 參考文檔如下
#
https://docs.docker.com/install/linux/docker-ce/centos/ https://docs.docker.com/install/linux/linux-postinstall/# 解除安裝舊版本
yum remove -y docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
# 安裝docker所需的工具
yum install -y yum-utils device-mapper-persistent-data lvm2
# 配置阿裡雲的docker源
yum-config-manager --add-repo
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo# 将伺服器上的軟體包資訊 先在本地緩存,以提高搜尋\安裝軟體的速度
yum makecache
# 指定安裝這個版本的docker-ce
yum install -y docker-ce-18.09.7 docker-ce-cli-18.09.7 containerd.io
# 更新 cgroupdriver 為systemd
# 如果不修改,在添加 worker 節點時可能會碰到如下錯誤
# [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd".
cat <<EOF > /etc/docker/daemon1.json
{
"registry-mirrors": ["https://uy35zvn6.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
# 啟動docker
systemctl enable docker && systemctl start docker
# 驗證docker 是否安裝成功
docker version
2. 設定k8s環境準備條件(所有機器)
安裝k8s的機器需要2個CPU和2g記憶體以上,這個簡單,在虛拟機裡面配置一下就可以了。然後執行以下腳本做一些準備操作。所有安裝k8s的機器都需要這一步操作。
# 關閉防火牆
systemctl disable firewalld
systemctl stop firewalld
# 關閉selinux
# 臨時禁用selinux
setenforce 0
# 永久關閉 修改/etc/sysconfig/selinux檔案設定
sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
# 禁用交換分區
swapoff -a
# 永久禁用,打開/etc/fstab注釋掉swap那一行。
sed -i 's/.*swap.*/#&/' /etc/fstab
# 修改核心參數
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
# 手動加載所有的配置檔案
sysctl --system
# 單獨指定配置檔案加載,執行:
# sysctl -p XXX.conf
3. 安裝kubeadm、kubelet、kubectl(所有機器)
安裝kubeadm、kubelet、kubectl
由于官方k8s源在google,國内無法通路,這裡使用阿裡雲yum源
# 執行配置k8s的yum--阿裡源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=
https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=
https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg# 安裝kubeadm、kubectl、kubelet
yum install -y kubectl-1.16.0-0 kubeadm-1.16.0-0 kubelet-1.16.0-0
# 重新開機 docker,并啟動 kubelet
systemctl daemon-reload
systemctl restart docker
systemctl enable kubelet && systemctl start kubelet
- 初始化k8s 以下這個指令開始安裝k8s需要用到的docker鏡像,因為無法通路到國外網站,是以這條指令使用的是國内的阿裡雲的源(registry.aliyuncs.com/google_containers)。
- 另一個非常重要的是:這裡的-
使用的是master和node間能互相ping通的ip,我這裡是10.0.0.198,剛開始在這裡被坑了一個晚上,你請自己修改下ip執行。這條指令執行時會卡在[preflight] You can also perform this action in beforehand using ''kubeadm config images pull,大概需要2分鐘,請耐心等待。
-apiserver-advertise-address
4. 安裝k8s v1.16.0 master管理節點
如果還沒安裝docker,請參照本文步驟二安裝docker-ce 18.09.9(所有機器)安裝。如果沒設定k8s環境準備條件,請參照本文步驟三設定k8s環境準備條件(所有機器)執行。
# 隻在 master 節點執行
# 替換 x.x.x.x 為 master 節點的内網IP
# export 指令隻在目前 shell 會話中有效,開啟新的 shell 視窗後,如果要繼續安裝過程,請重新執行此處的 export 指令
export MASTER_IP=x.x.x.x
# 替換 apiserver.demo 為 您想要的 dnsName
export APISERVER_NAME=apiserver.demo
# Kubernetes 容器組所在的網段,該網段安裝完成後,由 kubernetes 建立,事先并不存在于您的實體網絡中
export POD_SUBNET=10.244.0.0/16
echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts
以上兩個步驟檢查完畢之後,繼續以下步驟。
# 下載下傳管理節點中用到的6個docker鏡像,你可以使用docker images檢視到
# 這裡需要大概兩分鐘等待,會卡在[preflight] You can also perform this action in beforehand using ''kubeadm config images pull
kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.16.0 --apiserver-advertise-address 10.0.0.198 --pod-network-cidr=10.244.0.0/16 --token-ttl 0
上面安裝完後,會提示你輸入如下指令,複制粘貼過來,執行即可。
# 上面安裝完成後,k8s會提示你輸入如下指令,執行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
記住node加入叢集的指令---- 上面kubeadm init執行成功後會傳回給你node節點加入叢集的指令,等會要在node節點上執行,需要儲存下來
kubeadm join 10.0.0.198:6443 --token 95z94h.dgzgq3ceum5kju42 \
--discovery-token-ca-cert-hash sha256:6355f704056ca21d498e7d5e09c6f446b745fcc526d58f8615eaed9ba34d77a0
如果忘記了,可以使用如下指令擷取。
kubeadm token create --print-join-command
以上,安裝master節點完畢。可以使用kubectl get nodes檢視一下,此時master處于NotReady狀态,需要安裝網絡插件。
安裝網絡插件
安裝calico (master機器)
# 安裝 calico 網絡插件
# 參考文檔
https://docs.projectcalico.org/v3.9/getting-started/kubernetes/yum install wget
wget
https://kuboard.cn/install-script/calico/calico-3.9.2.yamlsed -i "s#192\.168\.0\.0/16#${POD_SUBNET}#" calico-3.9.2.yaml
kubectl apply -f calico-3.9.2.yaml
修改 Pods 使用的 IP 網段,預設使用 192.168.0.0/16 網段,但是和我們的伺服器本來的網段不一樣,會産生沖突,是以我們需要修改一下,注意,這個網段應該與kubeapi定義--service-cluster-ip-range的網段一樣
安裝flannel(master機器)
- 下載下傳官方fannel配置檔案 使用wget指令,位址為: https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml ,這個位址國内通路不了,是以我把内容複制下來,為了避免前面文章過長,我把它粘貼到文章末尾附錄了。
- 這個yml配置檔案中配置了一個國内無法通路的位址(quay.io),我已經将其改為國内可以通路的位址(quay-mirror.qiniu.com)。我們建立一個kube-flannel.yml檔案,複制粘貼該内容即可。
mkdir -p ~/k8s/
cd ~/k8s
curl -O
kubectl apply -f kube-flannel.yml
測試叢集DNS是否可用
執行指令進入鏡像
kubectl run curl --image=radial/busyboxplus:curl -it
如下所示表示正常
kubectl run --generator=deployment/apps.v1beta1 is DEPRECATED and will be removed in a future version. Use kubectl create instead.If you don't see a command prompt, try pressing enter.
[ root@curl-6bf6db5c4f-hkd27:/ ]$
進入後執行以下指令确認解析正常
nslookup kubernetes.default
[ root@curl-69c656fd45-42gj9:/ ]$ nslookup kubernetes.def
ault
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name: kubernetes.default
Address 1: 10.96.0.1 kubernetes.default.svc.cluster.loca
5. 安裝k8s v1.16.0 node工作節點
加入叢集 這裡加入叢集的指令每個人都不一樣,可以登入master節點,使用kubeadm token create --print-join-command 來擷取。擷取後執行如下。
# 加入叢集,如果這裡不知道加入叢集的指令,可以登入master節點,使用kubeadm token create --print-join-command 來擷取
--discovery-token-ca-cert-hash sha256:6355f704056ca21d498e7d5e09c6f446b745fcc526d58f8615eaed9ba34d77a0
加入成功後,可以在master節點上使用kubectl get nodes指令檢視到加入的節點。
問題: The connection to the server localhost:8080 was refused
出現這個問題的原因是kubectl指令需要使用
kubernetes-admin的身份
來運作,在
kubeadm int
啟動叢集的步驟中就生成了
/etc/kubernetes/admin.conf
。
是以,解決方法如下,将主節點中的
/etc/kubernetes/admin.conf
檔案拷貝到工作節點相同目錄下:
#複制admin.conf,請在主節點伺服器上執行此指令
scp /etc/kubernetes/admin.conf 10.0.0.199:/etc/kubernetes/admin.conf
scp /etc/kubernetes/admin.conf 10.0.0.200:/etc/kubernetes/admin.conf
然後分别在工作節點上配置環境變量:
#設定kubeconfig檔案
export KUBECONFIG=/etc/kubernetes/admin.conf
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
6. kubeadm還原
叢集初始化如果遇到問題,可以使用下面的指令進行清理
kubeadm reset
ifconfig cni0 down
ip link delete cni0
ifconfig flannel.1 down
ip link delete flannel.1
rm -rf /var/lib/cni/