kubeadm部署K8S集羣

1. Kubernetes概述

1.1 Kubernetes是什麼

  • Kubernetes是Google在2014年開源的一個容器集羣管理系統,Kubernetes簡稱K8S。
  • K8S用於容器化應用程序的部署,擴展和管理。
  • K8S提供了容器編排,資源調度,彈性伸縮,部署管理,服務發現等一系列功能。
  • Kubernetes目標是讓部署容器化應用簡單高效。

1.2 Kubernetes的特性

1)自我修復html

  • 在節點故障時從新啓動失敗的容器,替換和從新部署,保證預期的副本數量;
  • 殺死健康檢查失敗的容器,而且在未準備好以前不會處理客戶端請求,確保線上服務不中斷;

2)彈性伸縮node

  • 使用命令、UI或者基於CPU使用狀況自動快速擴容和縮容應用程序實例,保證應用業務高峯併發時的高可用性;
  • 業務低峯時回收資源,以最小成本運行服務

3)自動部署和回滾linux

  • Kubernetes採用滾動跟新策略更新應用,一次更新一個Pod,而不是同時刪除全部的Pod,若是更新過程當中出現問題,將回滾更改,確保升級不影響業務。

4)服務發現和負載均衡nginx

  • K8S爲多個容器提供一個統一訪問入口(內部IP地址和一個DNS名稱),而且負載均衡關聯的全部容器,使得用戶無需考慮容器IP問題。

5)機密和配置管理git

  • 管理機密數據和應用程序配置,而不須要把敏感數據暴露在鏡像裏,提升敏感數據安全性。並能夠將一些經常使用的配置存儲在K8S中,方便應用程序使用。

6)存儲編排github

  • 掛載外部存儲系統,不管是來自本地存儲,公有云(AWS),仍是網絡存儲(NFS、GlusterFS、Ceph)都做爲集羣資源的一部分使用,極大提升存儲使用靈活性

7)批處理算法

  • 提供一次性服務,定時任務;知足批量數據處理和分析的場景

1.3 Kubernetes集羣架構組件

1)Master組件docker

  • kube-apiserver
    • (Kubernetes API)集羣的統一入口,各組件協調者,以RESTful API提供接口服務,全部對象資源的增刪改查和監聽操做都交給APIServer處理後再提交給Etcd存儲。
  • kube-controller-manager
    • 處理集羣中常規後臺任務,一個資源對應一個控制器,而ControllerManager就是負責管理這些控制器的
  • kube-schedule
    • 根據調度算法爲新建立的Pod選擇一個Node節點,能夠任意部署,能夠部署在同一個節點上,也能夠部署在不一樣的節點上
  • etcd
    • 分佈式鍵值存儲系統。用於保存集羣狀態數據,好比Pod、Service等對象信息。

2)Node組件 bootstrap

  • kubelet
    • kubelet是Master在Node節點上的Agent,管理本機運行容器的生命週期,好比建立容器、Pod掛載數據卷、下載secret、獲取容器和節點狀態等工做。kubelet將每一個Pod轉換成一組容器
  • kube-proxy
    • 在Node節點上實現Pod網絡代理,維護網絡規則和四層負載均衡工做。
  • docker 或 rocket
    • 容器引擎,運行容器

1.4 Kubernetes核心概念

1)Podcentos

  • 最小部署單元
  • 一組容器的集合
  • 一個Pod中的容器共享網絡命名空間
  • Pod是短暫的

2)Controller

  • ReplicaSet:確保預期的Pod副本數量
  • Deployment:無狀態應用部署
  • StatefulSet:有狀態應用部署
  • DaemonSet:確保全部Node運行同一個Pod
  • Job:一次性任務
  • Cronjob:定時任務

3)更高級層次對象,部署和管理Pod

  • Service:
    • 防止Pod失聯;定義一次Pod的訪問策略
    • Service抽象層不過是iptables或者ipvs中的規則而已
  • Label:標籤,附加到某個資源上,用於關聯對象、查詢和篩選
  • Namespaces:命名空間,將對象邏輯上隔離
  • Annotations:註釋

4)網絡解決方案

  • K8S經過CNI插件體系來接入外部網絡服務解決方案
  • 常見的有:
    • flannel:網絡配置相關
    • calico:網絡配置、網絡策略
    • canel:flannel的網絡配置 + calico的網絡策略

5)三種網絡

  • Pod網絡:Pod的地址是配置在Pod內部的網絡名稱空間上的,是能ping通的,就像正常主機上的地址同樣
  • Service網絡(集羣網絡):Service的地址是虛擬的,它只存在於iptables或者ipvs的規則之中
  • 節點網絡:各個節點也應該有一個網絡

各個Pod運行在同一個網絡中,而service是另一個網絡;Pod和service的地址是不一樣網段的。

接入外部訪問時,先接入節點網絡,而後由節點網絡代理至集羣網絡,再由集羣網絡代理至Pod網絡。

同一Pod內的多個容器之間經過 lo 接口進行通訊。

兩個Pod之間能夠直接進行通訊:經過隧道的方式(Overlay疊加網絡)來轉發二層報文,使得它們雖然擴主機可是好像工做在同一個二層網絡中。訪問對方Pod所在節點的位置,而後再代理到Pod內部的容器上。

2. 使用kubeadm部署K8S集羣

2.1 Kubernetes的三種部署方式

1)minikube

2)kubeadm

3)二進制包

2.2 K8S集羣的部署規劃

1)環境需求

  • 系統:CentOS7.4
  • 內存 > 1.7G
  • CPU > 2核

2)角色規劃

3)網絡模型

  • 節點網絡:172.18.0.0/16
  • Pod網絡:10.244.0.0/16
  • Service網絡:10.96.0.0/12

2.3 環境初始化

  • 在全部節點上都執行

1)關閉防火牆、SELinux

# 關閉防火牆並設置開機禁止啓動
systemctl stop firewalld && systemctl disable firewalld

# 關閉SELinux
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config  && setenforce 0

2)關閉swap分區

# 臨時關閉全部swap
swapoff -a 

# 在/etc/fstab中機制掛載swap
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

3)設置主機名並配置hosts

# 爲各個主機配置主機名
hostnamectl set-hostname k8s-master01
hostnamectl set-hostname k8s-node01
hostnamectl set-hostname k8s-node02

# 配置好主機名後將如下內容寫入到全部節點的 /etc/hosts 文件中
172.18.0.67 k8s-master01
172.18.0.68 k8s-node01
172.18.0.69 k8s-node02

4)內核調整

  • 將橋接的 IPv4 的流量傳遞到 iptables的鏈
# 設置 net.bridge.bridge-nf-call-ip6tables = 1
# 設置 net.bridge.bridge-nf-call-iptables = 1
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sysctl --system  # Load  settings  from all system configuration files

5)爲各個主機作時間同步

  • 啓動chrony服務同步時間便可

2.4 開始安裝

  • 在全部節點上執行

1)配置安裝源

  • 配置docker-ce的源
cd /etc/yum.repos.d/ && wget -c https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
# 注意要修改下載下來的這個repo文件中的地址,將其指向爲清華的源的地址
  • 配置Kubernetes的源
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

2)安裝docker-ce

yum install -y docker-ce
systemctl start docker && systemctl enable docker
docker info
# 安裝完成以後注意要爲docker配置好鏡像加速

3)安裝kubeadm、kubelet 和 kubectl

yum install kubelet kubeadm kubectl -y
# 注意,要讓kubelet開機自啓,如今還不能去手動啓動它
systemctl enable kubelet  

4)爲kubelet配置額外參數

# 能夠在 /etc/sysconfig/kubelet 這個文件中添加額外的參數
# 如關閉swap功能
KUBELET_EXTRA_ARGS="--fail-swap-on=false"

2.5 部署 K8S Master

  • 只須要在 k8s-master節點上執行

1)初始化master

kubeadm init \
--kubernetes-version v1.20.2 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--apiserver-advertise-address=172.18.0.67 \
--ignore-preflight-errors=Swap \
--image-repository registry.aliyuncs.com/google_containers 

# apiserver要修改爲本身的master節點的地址,默認apiserver監聽在全部地址的6443端口上
# 若是swap報錯,能夠加上選項--ignore-preflight-errors=Swap,可是注意那個Swap的S要大寫
# 因爲默認拉取鏡像地址k8s.gcr.io國內沒法訪問,這裏指定阿里雲鏡像倉庫地址
# 注意kubernetes的版本要和以前安裝的kubelet的版本一致

2)根據回顯提示操做

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

3)測試

# 獲取組件狀態信息
kubectl  get  cs   # cs是kubectl get componentstatus的簡寫,獲取組件狀態信息

# 查看k8s集羣的節點信息
kubectl get nodes  

4)token失效解決

由於默認 token 的有效期爲24小時,過時以後該token就不可用了,因此若是後續有node節點加入,能夠從新生成新的token

  • 從新生成新的token
[root@master01 ~]# kubeadm token create
salxe7.gnlwtozqxxsf4uu7
[root@master01 ~]# kubeadm token list
TOKEN                     TTL         EXPIRES                     USAGES                   DESCRIPTION                                                EXTRA GROUPS
he4ugm.z537h1g7taugguco   23h         2021-01-19T15:53:34+08:00   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token
salxe7.gnlwtozqxxsf4uu7   23h         2021-01-19T15:53:48+08:00   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token
t4xdcj.5vgr19ymj4g6y7hm   6h          2021-01-18T22:31:08+08:00   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token
[root@master01 ~]#
  • 獲取ca證書sha256編碼hash值
[root@master01 ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
19060b637433363db284e831fce4bd567f82d8070b2744741dbe2f1cfa804d53
  • 節點加入集羣
kubeadm join 172.18.0.67:6443 --token t4xdcj.5vgr19ymj4g6y7hm --discovery-token-ca-cert-hash sha256:19060b637433363db284e831fce4bd567f82d8070b2744741dbe2f1cfa804d53 --ignore-preflight-errors=Swap

2.6 加入K8S Node

  • 在兩個Node節點執行

註冊Node節點到Master

# kubeadm join 的內容,在上面kubeadm init 已經生成好了
kubeadm join 172.18.0.67:6443 --token t4xdcj.5vgr19ymj4g6y7hm --discovery-token-ca-cert-hash sha256:19060b637433363db284e831fce4bd567f82d8070b2744741dbe2f1cfa804d53 --ignore-preflight-errors=Swap

2.7 安裝網絡插件flannel

  • 在master節點上安裝便可,其餘節點加入k8s集羣后會自動安裝

1)安裝flannel

# 這個地址可能訪問不到,能夠開小飛機手動把這個文件下載下來,而後再apply
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

# 執行的成功與否要看docker image ls中是否有flannel的鏡像,慢慢等待它下載便可
# 要確保可以訪問到 quay.io 這個registery
# 若是沒法訪問,能夠將此文件中image項後面的地址修改爲能夠訪問到的地址

2)查看是否安裝成功

# 注意,要確保狀態爲全1/1時,纔可進行後續操做
[root@k8s-master01 ~]# kubectl get pods -n kube-system
NAME                                   READY   STATUS    RESTARTS   AGE
coredns-7f89b7bc75-9zxjz               1/1     Running   0          12m
coredns-7f89b7bc75-n8p4s               1/1     Running   0          12m
etcd-k8s-master01                      1/1     Running   0          12m
kube-apiserver-k8s-master01            1/1     Running   0          12m
kube-controller-manager-k8s-master01   1/1     Running   0          12m
kube-flannel-ds-b5ljk                  1/1     Running   0          7m58s
kube-proxy-cwzkw                       1/1     Running   0          12m
kube-scheduler-k8s-master01            1/1     Running   0          12m

# 確保全部節點爲Ready狀態
[root@k8s-master01 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master01 Ready control-plane,master 93m v1.20.2
k8s-node01 Ready <none> 49m v1.20.2

3)flannel安裝失敗後重裝

  • 若是flannel由於網絡問題安裝失敗,須要進行從新安裝
kubectl delete -f kube-flannel.yml

# 而後從新安裝
kebectl apply -f kube-flannel.yml

3. Kubernetes集羣信息查看及管理

3.1 Pod的建立與查看

1)信息查看

# 查看k8s集羣的總體信息
kubectl  cluster-info

# 查看當前系統上已經被建立的控制器
kubectl get deployment

# 查看pod的相關信息
kubectl get pods
kubectl get pods -o wide  # 查看更詳細的信息

# 查看services的相關信息
kubectl get services
kubectl get svc

# 查看kube-system名稱空間中service的相關信息
kubectl get svc -n kube-system

2)建立一個pod

# 建立並運行一個特定的鏡像,暴露80端口,而且只建立1個副本,幹跑模式須要再加上--dry-run=true
kubectl run nginx-deploy --image=nginx:1.14 --port=80 --replicas=1

# 若是要鏡像中運行其餘程序,能夠寫成這樣(注意前面要加 -- ) kubectl run nginx-deploy --image=nginx:1.14 --port=80 --replicas=1 -- /bin/sh

 3)對剛剛建立的pod進行查看並訪問

[root@k8s-master01 ~]# kubectl get pods -o wide
NAME           READY   STATUS    RESTARTS   AGE    IP           NODE         NOMINATED NODE   READINESS GATES
nginx-deploy   1/1     Running   0          3m6s   10.244.1.2   k8s-node01   <none>           <none>
[root@k8s-master01 ~]# curl 10.244.1.2

3.2 建立pod並暴露端口

  • 在Kubernetes集羣中建立一個pod,而後暴露端口,驗證其是否能夠正常訪問

1)建立deployment

# 建立一個deployment控制器,這個控制器的名字就叫nginx-deploy
kubectl create deployment nginx-deploy --image=nginx

2)建立service並暴露端口

kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80 --protocol=TCP # 將nginx-deploy這個控制器(deployment  )相關的pod資源都建立爲一個服務,服務名叫nginx
# --name   是service的名稱
# --port   是service暴露到外部的端口
# --target-port  是pod暴露的端口
# --protocol     使用的協議,默認就是TCP
# --type         是service的類型,service有多種類型,可kubectl expose --help來查看--type選項,Defaultis 'ClusterIP'

3)查看相關信息並訪問

# 查看pod和service的相關信息
[root@k8s-master01 ~]# kubectl get pods,svc
NAME                               READY   STATUS    RESTARTS   AGE
pod/nginx-deploy-8588f9dfb-t8wzr   1/1     Running   0          11m

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   78m
service/nginx        ClusterIP   10.99.193.184   <none>        80/TCP    34s

# 查看kube-system名稱空間中service的相關信息
kubectl get svc -n kube-system

# 訪問:http://NodeIP:PORT,只有在集羣內部的節點上才能被訪問到
curl http://10.99.193.184

 

 

 

 

 參考:

  • https://www.cnblogs.com/jiangwenhui/p/11792519.html
  • https://www.cnblogs.com/double-dong/p/11483670.html
相關文章
相關標籤/搜索