k8s集群部署

三臺機器分別是:master1(172.16.22.27),master2(172.16.22.28),master3(172.16.29)

kubeadm 方式

1. 安裝運行時

目前主流運行時有containerd,docker,CRI-O,只需選擇一種就可以,推薦使用containerd,不管是master還是node都需要安裝運行時。

安裝docker

docker具體使用可參考https://juejin.cn/post/6873395391112019982

安裝containerd

  • 安裝和配置的先決條件
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# 設置必需的 sysctl 參數(shù),這些參數(shù)在重新啟動后仍然存在。
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

# 應用 sysctl 參數(shù)而無需重新啟動
sudo sysctl --system
  • 安裝配置
#安裝
yum install containerd.io

#配置
containerd config default > /etc/containerd/config.toml #生成配置文件
#配置cgroup driver 為 systemd
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
  ...
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
    SystemdCgroup = true

#重啟
systemctl restart containerd

注意:確保kubelet的cgroup的驅動與containerd 驅動保持一致,不然會導致k8s初始化失敗,修改/etc/sysconfig/kubelet文件 --cgroup-driver=cgroupfs 或者 --cgroup-driver=systemd

2. Keepalived 安裝

控制平面采用keepalived+vip實現(xiàn)高可用(HA)
具體配置見:http://www.itdecent.cn/p/8e8d318876c7

3.ETCD安裝

Kubernete底層存儲是采用etcd,高可用集群有兩個選項:外部etcd,堆疊模式,推薦使用外部etcd方式

  • 外部etcd
    etcd 分布式數(shù)據(jù)存儲集群在獨立于控制平面節(jié)點的其他節(jié)點上運行
    每個etcd成員與每個節(jié)點的kube-apiserver通信,該拓撲結構解耦了控制平面和etcd成員


    外部etcd.png
  • 堆疊模式
    HA集群默認拓撲結構,每個控制平面節(jié)點創(chuàng)建一個本地etcd成員,該成員只與該節(jié)點的kube-apiserver通信,同樣適用于本地 kube-controller-manager 和 kube-scheduler 實例。該模式設置簡單,但etcd成員跟控制平面強耦合


    堆疊模式.png

具體安裝見http://www.itdecent.cn/p/bc060063450e

3. 配置k8s阿里云源 或者(imdingtalk)

cat > /etc/yum.repos.d/kubernetes.repo << EOF
    [kubernetes]
    name=Kubernetes
    baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
    enabled=1
    gpgcheck=0
    repo_gpgcheck=0
    gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    EOF    

4. 安裝 kubeadm kubelet kubectl

kubeadm kubelet kubectl 統(tǒng)稱為k8s三劍客

  • kubeadm 初始化k8s集群的工具 詳細命令見:kubeadm -h
  • kubelet 每個節(jié)點守護進程
  • kubectl k8s集群命令行工具 kubectl -h
# 控制平面節(jié)點和運行節(jié)點都需要
yum install -y  kubeadm-1.20.5 kubectl-1.20.5 kubelet-1.20.5

5. 初始化集群

先在master1機器上執(zhí)行一下操作

#初始化配置文件
kubeadm config print init-defaults  > /etc/kubeadm-config.yaml

通過配置定制化組件

#配置InitConfiguration
apiVersion: kubeadm.k8s.io/v1beta2
kind: InitConfiguration
....
  criSocket: "/run/containerd/containerd.sock" #指定讀取運行時信息
localAPIEndpoint:
#advertiseAddress: "172.16.22.27" #設置API服務器要公布的IP地址,可不設置,自動讀取ip地址
  bindPort: 6443 #默認端口

#ClusterConfiguration配置
---
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: "v1.20.5" #指定安裝版本
controlPlaneEndpoint: "172.16.22.200:6443" #指定控制面負載均衡ip地址或者dns地址+端口,可指定keepalived vip
certificatesDir: "/etc/kubernetes/pki"
imageRepository: "registry.aliyuncs.com/google_containers"  #指定鏡像倉庫地址
clusterName: "kubernetes" #集群的名稱
dns:
   type: CoreDNS #定義DNS插件
etcd:
   external:
       endpoints:
        - https://172.16.22.27:2379
        - https://172.16.22.28:2379 
        - https://172.16.22.29:2379
        caFile: /etc/etcd/pki/ca.crt
        certFile: /etc/etcd/pki/etcd.crt
        keyFile: /etc/kubernetes/pki/etcd.key
networking:
  serviceSubnet: "10.96.0.0/16"  #Kubernetes 服務所使用的的子網(wǎng),集群網(wǎng)絡
  podSubnet: "10.244.0.0/24" #Pod 所使用的子網(wǎng)
  dnsDomain: "cluster.local"
scheduler: {}
controllerManager: {}

#配置KubeletConfiguration
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd #配置設置kubelet 的cgroupDriver

詳細參數(shù)見https://kubernetes.io/zh/docs/reference/config-api/kubeadm-config.v1beta2/

#執(zhí)行初始化
kubeadm init --config /etc/kubeadm-config.yaml

--upload-certs 標志用來將在所有控制平面實例之間的共享證書上傳到集群(加密并上傳到 kubeadm-certs Secret 中),如果喜歡手動,需要復制證書到其它控制面節(jié)點

輸出類似于:

...
You can now join any number of control-plane node by running the following command on each as a root:
kubeadm join 192.168.0.200:6443 --token 9vr73a.a8uxyaju799qwdjv --discovery-token-ca-cert-hash sha256:7c2e69131a36ae2a042a339b33381c6d0d43887e2de83720eff5359e26aec866 --control-plane --certificate-key f8902e114ef118304e561c3ecd4d0b543adc226b7a07f675f56564185ffe0c07

Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use kubeadm init phase upload-certs to reload certs afterward.

Then you can join any number of worker nodes by running the following on each as root:
  kubeadm join 192.168.0.200:6443 --token 9vr73a.a8uxyaju799qwdjv --discovery-token-ca-cert-hash sha256:7c2e69131a36ae2a042a339b33381c6d0d43887e2de83720eff5359e26aec866
#耐心等待
 # 使非 root 用戶可以運行 kubectl,請運行以下命令, 它們也是kubeadm init 輸出的一部分:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
或者,如果你是 `root` 用戶,則可以運行:
export KUBECONFIG=/etc/kubernetes/admin.conf

要重新上傳證書并生成新的解密密鑰,請在已加入集群節(jié)點的控制平面上使用以下命令:

kubeadm init phase upload-certs --upload-certs

6. 安裝網(wǎng)絡插件flannel

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml##修改對應參數(shù)

拷貝證書到其余master

for node in master2 master3; do
  ssh $node "mkdir -p ~/.kube/"
  scp /etc/kubernetes/pki/ca.crt $node:/etc/kubernetes/pki/ca.crt
  scp /etc/kubernetes/pki/ca.key $node:/etc/kubernetes/pki/ca.key
  scp /etc/kubernetes/pki/sa.key $node:/etc/kubernetes/pki/sa.key
  scp /etc/kubernetes/pki/sa.pub $node:/etc/kubernetes/pki/sa.pub
  scp /etc/kubernetes/pki/front-proxy-ca.crt $node:/etc/kubernetes/pki/front-proxy-ca.crtcs
  scp /etc/kubernetes/pki/front-proxy-ca.key $node:/etc/kubernetes/pki/front-proxy-ca.key
  scp /etc/kubernetes/admin.conf $node:/etc/kubernetes/admin.conf
  scp /etc/kubernetes/admin.conf $node:~/.kube/config
done

7. 加入master

kubeadm join 172.16.22.200:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash> --control-plane

8. 加入節(jié)點

#node加入集群
kubeadm join 172.16.22.200:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>

#重新生成token
kubeadm token create --print-join-command

安裝dashboard(可選)

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.2.0/aio/deploy/recommended.yaml

卸載

kubeadm reset -f
modprobe -r ipip
lsmod
rm -rf ~/.kube/
rm -rf /etc/kubernetes/
rm -rf /etc/systemd/system/kubelet.service.d
rm -rf /etc/systemd/system/kubelet.service
rm -rf /usr/bin/kube*
rm -rf /etc/cni
rm -rf /opt/cni
rm -rf /var/lib/etcd
rm -rf /var/etcd
yum clean all
yum remove kube*
ip link set cni0 down
ip link delete cni0    

證書更換

1.查看證書過期信息

kubeadm certs check-expiration 

2.重新生成證書

kubeadm certs renew all --config /etc/kubeadm-config.yaml

輸出


renew.png

3.重啟服務器或者重啟kube-apiserver,kube-controller-manager,kube-scheduler服務(直接刪除pod,自動重建)

v1.15版本之前參考https://github.com/yuyicai/update-kube-cert/

常見問題

  • k8s master機器重啟,kubelet無法啟動,是因為重啟swap又開啟
  • "cni0" already has an IP address different from x.x.x.x
    刪除cni0會自動重建,
    ifconfig cni0 down
    ip link delete cni0
  • 云主機無法指定公網(wǎng)IP
    kubeadm即開始了master節(jié)點的初始化,但是由于etcd配置文件不正確,所以etcd無法啟動,要對該文件進行修改。文件路徑"/etc/kubernetes/manifests/etcd.yaml" --listen-client-urls 和 --listen-peer-urls改成內網(wǎng)ip,因為公網(wǎng)ip沒配,無法監(jiān)聽
  • flannel 安裝失敗: Error registering network: failed to acquire lease
    確保master 節(jié)點初始化時pod-network-cidr 與 kube-flannel.yml 網(wǎng)段要一致
    默認是10.244.0.0/16
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容