Kubernetes(三):集群部署



k8s部署環境

  • 公有雲環境:AWS、騰訊雲、阿里雲等等
  • 私有雲:OpenStack、vSphere等
  • Baremetal環境:物理服務器或獨立虛擬機(底層沒有雲環境)。

k8s運行模式

  k8s運行模式有如下三種,使用kubeadm方式部署的k8s集群可運行為第二種或者第三種模式,默認為第二種模式,如果需要使用第三種模式,需要在kubeadm init時加上參數“--features-gates=selfHosting”。

  • 第一種模式:“獨立組件模式”,系統各組件直接以守護進程的方式運行在節點之上,各組件之間相互協作構成集群。
  • 第二種模式:“靜態Pod模式”,除kubelet和docker之外的其它組件(etcd、kube-apiserver、kube-scheduler、kube-controller-manager)都以靜態Pod對象運行與master主機上。
  • 第三種模式:“自托管模式(self-hosted)”,它類似於第二種模式,但並非靜態Pod。這些Pod對象托管運行在集群自身之上,受控於DaemonSet類型的控制器。

k8s部署方式

  • Minikube:Kubernetes官網提供的微型分布式環境,適合初次學習體驗。

  • 二進制部署:相對復雜,生產環境適用,將重要組件以守護進程的方式部署。

  • Kubeadm:由於二進制部署方式過於復雜,所以后來出現了Kubeadm的部署方式,這種方式其實是將k8s的各組件容器化托管於k8s集群之上。

  • 一些雲廠商專有的部署方式,如AWS的kops。

  • 還有一些二次封裝的k8s發行版,如:

    • Rancher:Rancher Labs基於k8s的二次封裝發行版。
    • Tectonic:CoreOS公司基於k8s的二次封裝發行版。
    • Openshift:Redhat基於k8s的二次封裝發行版,只留下k8s的成熟功能,部署更加便捷,需要有ansible基礎。相比較知名的發行版就是Rancher和Openshift

k8s部署要點

  • 測試環境

    • 單Master節點,單etcd,Node節點隨意。
    • 持久化數據可以使用NFS存儲。
  • 生產環境

    • 高可用Master,高可用etcd,至少三個節點。

      • kube-apiserver是無狀態的,可以配置多實例。利用nginx或者haproxy做反代,並借助keepalived實現冗余。
      • kube-scheduler和kube-controller-manager各自只能有一個活動實例(假設多個scheduler同時去調度一個Pod,那聽誰的呢?),但是可以建多個實例備用。他們自帶leader選舉功能,且默認開啟此功能。
    • 多Node主機,數量越多,冗余能力越強。

    • 持久化數據使用ceph或glusterfs等分布式存儲。

  • 環境准備

    • 如果有條件,最好搭建一個內網ntp服務,用來同步時間。
    • 配置好各節點間的hosts解析。
    • 禁用防火牆和Selinux,防止混淆。
    • 各節點禁用swap,使用swap雖然暫時能節省一些物理內存,但也會造成性能下降。安裝時會自動檢查此項,不禁用會導致安裝出錯,不過也有參數可以忽略。

kubeadm部署k8s

  • 主機規划(其實2C4G足矣)
主機名 IP 角色 環境
ck-master 192.168.2.24 控制節點 Centos 7.6 4C8G
ck-node1 192.168.2.25 數據節點 Centos 7.6 4C8G
ck-node2 192.168.2.26 數據節點 Centos 7.6 4C8G
ck-node3 192.168.2.27 數據節點 Centos 7.6 4C8G

  • 准備工作(所有節點操作)
  1. 未自行搭建ntp,使用定時任務替代。
[root@ck-master ~]# crontab -l 
# time sync
*/1 * * * * /usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null
  1. 配置主機名解析
[root@ck-master ~]# tail -4 /etc/hosts
192.168.2.24	ck-master
192.168.2.25	ck-node1
192.168.2.26	ck-node2
192.168.2.27	ck-node3
  1. 關閉防火牆和selinux
[root@ck-master ~]# systemctl stop firewalld.service
[root@ck-master ~]# systemctl disable firewalld.service
[root@ck-master ~]# sed -i.bak 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
[root@ck-master ~]# setenforce 0
  1. 禁用swap,默認情況下系統的swap都是打開的。
[root@ck-master ~]# swapoff -a
[root@ck-master ~]# echo 'swapoff -a' >>/etc/rc.local
  1. 配置免密。此步驟可選,我為了拷貝東西方便。
[root@ck-master ~]# yum -y install sshpass
[root@ck-master ~]# mkdir -p /server/scripts/
[root@ck-master ~]# cd /server/scripts/
[root@ck-master scripts]# vim batch.sh
#!/bin/bash

rm -rf /root/.ssh/id_dsa*
ssh-keygen -t dsa -f /root/.ssh/id_dsa -P '' -q

for ip in $*
do
  sshpass -p 123456 ssh-copy-id -i /root/.ssh/id_dsa.pub -o StrictHostKeyChecking=no 192.168.2.$ip &>/dev/null
  echo -e "\n\033[32m-----主機192.168.2.$ip公鑰分發完成-----\033[0m\n"
done
[root@ck-master scripts]# sh batch.sh 25 26 27
[root@ck-master scripts]# cd

  • 安裝組件(所有節點操作)
  1. 安裝docker引擎
[root@ck-master ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@ck-master ~]# yum -y install docker-ce
# 配置鏡像加速器。如果是中途更換的鏡像加速器,需要先systemctl daemon-reload,然后再systemctl restart docker。
[root@ck-master ~]# vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://p4y8tfz4.mirror.aliyuncs.com"]
}
[root@ck-master ~]# systemctl start docker
[root@ck-master ~]# systemctl enable docker
[root@ck-master ~]# docker info
# 此Warning如若放任不管,后面集群初始化和node節點加入集群都會報錯,我也不知道這兩條配置的具體作用,后面會研究一下。
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
[root@ck-master ~]# cat > /etc/sysctl.d/kubernetes.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
[root@ck-master ~]# sysctl -p /etc/sysctl.d/kubernetes.conf
  1. 配置k8s的yum倉庫,安裝kubeadm、kubelet、kubectl組件。
[root@ck-master ~]# 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
# 組件的版本要與下面kubernetes初始化時指定的版本保持一致。
[root@ck-master ~]# yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
[root@ck-master ~]# systemctl enable kubelet.service
# PS:此處無需啟動kubelet,后續將節點join到集群時,會自動拉起。

  • k8s集群初始化(master節點操作)
  1. kubeadm命令說明
[root@ck-master ~]# kubeadm --help
Usage:
  kubeadm [command]
Available Commands:
  alpha             # 處於測試中不太完善的命令
  config            # 顯示當前配置
  init              # 初始化集群
  join              # 各Node節點加入集群中時使用
  reset             # 每個節點都可以用,把配置還原到最初始的狀態。
  upgrade           # 升級集群的版本。
# print參數也是有子命令的,使用下面命令可以查看集群初始化時的預設配置,其中一些與我們真實環境不匹配,可以在初始化時手動指定修改。
[root@ck-master ~]# kubeadm config print init-defaults		# 下面只截取部分配置
imageRepository: k8s.gcr.io			# 默認加載鏡像的倉庫,需要梯子才能訪問,如果知道國內別的倉庫有需要的鏡像,初始化時可以手動指定倉庫地址。
kind: ClusterConfiguration
kubernetesVersion: v1.18.0			# k8s版本,這是初始化會加載的配置,如果與你預期的版本不符,自行修改。
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12		# Service網絡默認網段。
scheduler: {}
# 至於Pod網絡間通訊,k8s只提供CNI,真正實現網絡通信需要借助第三方插件,如flannel、calico,兩者各有優劣。flannel的默認地址是10.244.0.0/16,calico的默認地址是192.168.0.0/16。不使用默認地址也可以,只要保證部署網路插件時yaml中指定的網段與k8s部署時指定的Pod網絡網段一致就可。
  1. k8s集群初始化
[root@ck-master ~]# kubeadm init \
  --apiserver-advertise-address=192.168.2.24 \			# kube-apiserver的監聽地址。
  --image-repository=registry.aliyuncs.com/google_containers \		# 指定init過程中拉取鏡像的倉庫。
  --kubernetes-version=v1.18.0 \			# 指定kubernetes的版本。
  --service-cidr=10.96.0.0/12 \				# 指定service資源的網段。
  --pod-network-cidr=10.244.0.0/16 \		# 指定Pod資源的網段。
  --ignore-preflight-errors=all				# 忽略前置檢查中出現的錯誤,被忽略的錯誤會顯示為警告信息。
# PS:如果初始化過程出錯,可以使用kubeadm reset命令刪除初始化過程產生的文件,重置到初始狀態。上面執行結果會返回一些重要的信息:
Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:	# 建議使用普通用戶執行如下命令。

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.		# 提示需要安裝網絡插件。
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:		# 運行如下命令將一個節點加入到集群中。

kubeadm join 192.168.2.24:6443 --token s04557.easpgb5aztlba7pd \
    --discovery-token-ca-cert-hash sha256:e91a885d5c6412ca08236697b2b817ceaa4ec61f838439cab9b10ca2081dc117
--------------------------------------------------------------------------------------------------------------
# 上面是命令行的方式初始化,也可以使用配置文件來引導。
[root@ck-master ~]# vim kubeadm.conf
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.18.0
imageRepository: registry.aliyuncs.com/google_containers 
networking:
  podSubnet: 10.244.0.0/16 
  serviceSubnet: 10.96.0.0/12 
[root@ck-master ~]# kubeadm init --config kubeadm.conf --ignore-preflight-errors=all
--------------------------------------------------------------------------------------------------------------
# 上面集群初始化返回的結果中有提示建議使用普通用戶執行如下命令,此處為了方便就暫時不聽從他的建議了^_^。
[root@ck-master ~]# mkdir -p $HOME/.kube
[root@ck-master ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@ck-master ~]# chown $(id -u):$(id -g) $HOME/.kube/config		# 管理員下此步驟可省略
  1. 查看集群信息。
# 查看集群健康狀態。
[root@ck-master ~]# kubectl get cs
NAME                 STATUS    MESSAGE             ERROR
scheduler            Healthy   ok                  
controller-manager   Healthy   ok                  
etcd-0               Healthy   {"health":"true"} 
# 查看集群版本。
[root@ck-master ~]# kubectl version --short
Client Version: v1.18.0
Server Version: v1.18.0
# 查看集群信息。
[root@ck-master ~]# kubectl cluster-info
# [root@ck-master ~]# kubectl cluster-info dump表示查看集群詳細信息。
Kubernetes master is running at https://192.168.2.24:6443
KubeDNS is running at https://192.168.2.24:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.、
# 查看node信息
[root@ck-master ~]# kubectl get node
NAME        STATUS     ROLES    AGE   VERSION
ck-master   NotReady   master   47m   v1.18.0
# 上條命令表示master節點是NotReady的,通過看日志發現是缺少網絡插件,下面會安裝。
[root@ck-master ~]# tail -f /var/log/messages
Jul 27 17:29:24 k8s4 kubelet: W0727 17:29:24.559226   10459 cni.go:237] Unable to update cni config: no networks found in /etc/cni/net.d
Jul 27 17:29:27 k8s4 kubelet: E0727 17:29:27.641272   10459 kubelet.go:2187] Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
# PS:我們能夠在master上查看集群信息,主要就是因為家目錄下的.kube/config文件(admin.conf),也就是將這個文件拷貝到別的主機后,別的主機也可以使用查看集群的相關信息,並不建議這么做,存在一定的風險性。

  • 部署calico網絡插件(master節點操作)
  1. 上面在集群初始化時指定了Pod網絡網段為10.244.0.0/16,calico的默認網段為192.168.0.0/16,所以我們需要先修改下配置文件
[root@ck-master ~]# mkdir /server/k8s
[root@ck-master ~]# cd /server/k8s
[root@ck-master k8s]# wget https://docs.projectcalico.org/manifests/calico.yaml
[root@ck-master k8s]# vim calico.yaml		# 找到如下兩行,取消注釋並修改。
            - name: CALICO_IPV4POOL_CIDR
              value: "10.244.0.0/16"
  1. 安裝calico網絡插件。
[root@ck-master k8s]# kubectl apply -f calico.yaml
# 然后查看插件安裝狀態。
[root@ck-master k8s]# kubectl get pod -n kube-system -w
## -n:指定名稱空間
## -w:實時查看pod狀態。
## READY狀態取決於網速。
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-578894d4cd-bdm4s   1/1     Running   0          3m20s
calico-node-fzwlj                          1/1     Running   0          3m20s
coredns-7ff77c879f-6m9qb                   1/1     Running   0          54m
coredns-7ff77c879f-qc7jx                   1/1     Running   0          54m
etcd-ck-master                             1/1     Running   0          55m
kube-apiserver-ck-master                   1/1     Running   0          55m
kube-controller-manager-ck-master          1/1     Running   0          55m
kube-proxy-8cl6x                           1/1     Running   0          54m
kube-scheduler-ck-master                   1/1     Running   0          55m
# pod全部就緒后,再去看node,已經Ready了。
[root@ck-master k8s]# kubectl get node
NAME        STATUS   ROLES    AGE   VERSION
ck-master   Ready    master   57m   v1.18.0

  • 配置Node節點加入到k8s集群(所有Node節點執行)
  1. 根據k8s集群初始化的結果提示,使用如下命令將節點加入到集群中。
[root@ck-node1 ~]# kubeadm join 192.168.2.24:6443 --token s04557.easpgb5aztlba7pd \
    --discovery-token-ca-cert-hash sha256:e91a885d5c6412ca08236697b2b817ceaa4ec61f838439cab9b10ca2081dc117

  • 最終驗證(master節點執行)
  1. 查看node,全部Ready。
[root@ck-master k8s]# kubectl get node
NAME        STATUS   ROLES    AGE     VERSION
ck-master   Ready    master   64m     v1.18.0
ck-node1    Ready    <none>   2m31s   v1.18.0
ck-node2    Ready    <none>   113s    v1.18.0
ck-node3    Ready    <none>   112s    v1.18.0
  1. 節點join集群所用的token默認是24小時。
[root@ck-master k8s]# kubeadm token list
TOKEN                     TTL         EXPIRES                     USAGES                   DESCRIPTION                                                EXTRA GROUPS
s04557.easpgb5aztlba7pd   22h         2020-07-28T16:41:18+08:00   authentication,signing   The default bootstrap token generated by 'kubeadm init'.   system:bootstrappers:kubeadm:default-node-token
# 如果token過期,可以使用如下命令重新生成token。
[root@ck-master k8s]# kubeadm token create
W0727 17:52:37.585489    9637 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
64pxzt.sd7oeubsaz6geu3d
[root@ck-master k8s]# kubeadm token list
TOKEN                     TTL         EXPIRES                     USAGES                   DESCRIPTION                                                EXTRA GROUPS
64pxzt.sd7oeubsaz6geu3d   23h         2020-07-28T17:52:37+08:00   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token
# 如下命令得到CA公鑰的hash值
[root@ck-master k8s]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
e91a885d5c6412ca08236697b2b817ceaa4ec61f838439cab9b10ca2081dc117
# 組合得到命令:
kubeadm join 192.168.2.24:6443 --token 64pxzt.sd7oeubsaz6geu3d \
    --discovery-token-ca-cert-hash sha256:e91a885d5c6412ca08236697b2b817ceaa4ec61f838439cab9b10ca2081dc117

安裝dashboard

  1. 默認dashboard只能集群內部訪問,想要外部訪問需要修改service為NodePort類型。
[root@ck-master k8s]# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml
[root@ck-master k8s]# vim recommended.yaml
spec:
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30001			# 添加此行,此處端口可用范圍為30000-32767。
  selector:
    k8s-app: kubernetes-dashboard
  type: NodePort		# 添加此行
  1. 安裝dashboard。
[root@ck-master k8s]# kubectl apply -f recommended.yaml
[root@ck-master k8s]# kubectl get pod -n kubernetes-dashboard
NAME                                         READY   STATUS    RESTARTS   AGE
dashboard-metrics-scraper-6b4884c9d5-p7tzj   1/1     Running   0          48s
kubernetes-dashboard-7f99b75bf4-62tnf        1/1     Running   0          48s
  1. 訪問任意節點的IP+30001端口(https)即可訪問dashboard。
  1. 生成登錄token。
root@ck-master k8s]# kubectl create serviceaccount dashboard-admin -n kube-system
serviceaccount/dashboard-admin created
[root@ck-master k8s]# kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
clusterrolebinding.rbac.authorization.k8s.io/dashboard-admin created
[root@ck-master k8s]# kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
  1. 登錄。
  1. 也可以設置為使用賬戶密碼登錄dashboard,請自行百度。

安裝監控組件

  1. 默認集群不帶監控組件。
[root@ck-master k8s]# kubectl top pod
Error from server (NotFound): the server could not find the requested resource (get services http:heapster)
  1. heapster從1.11版本開始逐漸廢棄,替代品為新的組件metrics-server。
[root@ck-master k8s]# wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.7/components.yaml
[root@ck-master k8s]# vim components.yaml
      containers:
      - name: metrics-server
        image: hamerle/metrics-server:v0.3.7		# 默認的k8s.gcr.io我們是訪問不到的,所以我修改為自己的dockerhub。
        imagePullPolicy: IfNotPresent
        args:
          - --cert-dir=/tmp
          - --secure-port=4443
          - --kubelet-insecure-tls		# 設定不驗證tls
          - --kubelet-preferred-address-types=InternalIP	# 設定優先使用InternalIP的方式來訪問kubelet,這樣可以避免節點名稱沒有DNS解析記錄時,通過節點名稱調用節點kubelet API失敗的情況。
  1. 安裝組件。
[root@ck-master k8s]# kubectl apply -f components.yaml
[root@ck-master k8s]# kubectl get pods -n kube-system | grep metrics
metrics-server-6c9b6974db-ftmzc            1/1     Running   0          59s
  1. 查看各對象的資源使用信息。
[root@ck-master k8s]# kubectl top nodes
NAME        CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
ck-master   278m         6%     1905Mi          24%       
ck-node1    160m         4%     906Mi           11%       
ck-node2    142m         3%     904Mi           11%       
ck-node3    149m         3%     902Mi           11%
[root@ck-master k8s]# kubectl top pods etcd-ck-master -n kube-system
NAME             CPU(cores)   MEMORY(bytes)   
etcd-ck-master   17m          223Mi
  1. 安裝完監控插件后,dashboard就會展示一些新功能。


寫作不易,轉載請注明出處,謝謝~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM