天天看點

centos7 搭建 kubernetes1.16.7 叢集 centos7 搭建 kubernetes1.16.7 叢集 環境:0.檢查配置1. 安裝docker-ce 18.09.9(所有機器)2. 設定k8s環境準備條件(所有機器)4. 安裝k8s v1.16.0 master管理節點5. 安裝k8s v1.16.0 node工作節點6. kubeadm還原參考連結:

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

    指令中,可以知道機器的預設網卡,通常是

    eth0

    ,如 default via 172.21.0.23 dev eth0
  • ip address

    指令中,可顯示預設網卡的 IP 位址,Kubernetes 将使用此 IP 位址與叢集内的其他節點通信,如

    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

  1. 初始化k8s 以下這個指令開始安裝k8s需要用到的docker鏡像,因為無法通路到國外網站,是以這條指令使用的是國内的阿裡雲的源(registry.aliyuncs.com/google_containers)。
  2. 另一個非常重要的是:這裡的-

    -apiserver-advertise-address

    使用的是master和node間能互相ping通的ip,我這裡是10.0.0.198,剛開始在這裡被坑了一個晚上,你請自己修改下ip執行。這條指令執行時會卡在[preflight] You can also perform this action in beforehand using ''kubeadm config images pull,大概需要2分鐘,請耐心等待。

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.yaml

sed -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機器)

  1. 下載下傳官方fannel配置檔案 使用wget指令,位址為: https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml ,這個位址國内通路不了,是以我把内容複制下來,為了避免前面文章過長,我把它粘貼到文章末尾附錄了。
  2. 這個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/

參考連結:

https://kuboard.cn/install/history-k8s/install-k8s-1.16.3.html