1. 程式人生 > 實用技巧 >kubeadm部署1.18.0單master叢集

kubeadm部署1.18.0單master叢集

1、有了docker,為什麼還用kubernetes?

訪問工具層

幫助使用者更高效的完成任務,包括web控制檯、RESTfulAPI、CI/CD、監控管理、日誌管理

PaaS服務層

為開發、測試和運維人員提供統一的平臺服務

容器編排

Kubernetes

容器引擎

Docker

IaaS基礎設施層

提供基礎執行環境,例如虛擬機器、物理機、網路、儲存、資料庫、公有云等

2、kubernetes是什麼

l Kubernetes是Google在2014年開源的一個叢集管理系統,kubernetes簡稱k8s

l Kubernetes用於容器化應用程式的部署,擴充套件和管理,目標是讓部署容器化應用簡單高效。

官網:http://wwwkubernetes.io

3、Kubernetes叢集架構與元件

Kubernetes叢集架構與元件

master元件

kube-apiserver

kubernetes API叢集的同一入口,各元件協調者,以RESTful API提供介面服務,所有物件資源的增刪改查和監聽操作都交給APIserver處理再提交給Etcd儲存

kube-controller-manager

處理叢集中常規後臺任務,一個資源對應一個控制器,而ControllerManager就是負責管理這些控制器的

kube-scheduler

根據排程演算法為新建立的POdxuanz yig Node節點,可以在任意部署,可以部署在同一個節點上,也可以部署在不同節點上

etcd

分散式鍵值儲存系統,用於報銷叢集狀態資料,比如Pod、service等物件資訊,可以獨立部署,但是需要部署在3個叢集機器上,保證高可用。

Node元件

kubelet

kubelet是master在node節點上的agent,管理本機執行容器的生命週期,比如建立容器、Pod掛載資料卷、下載secret、獲取容器和節點狀態等工作,kubelet將每個Pod轉成一組容器。

kube-proxy

在Node節點上實現Pod網路代理,維護網路規則和四層負載均衡工作

docker或rocket

容器引擎,執行容器

kubeadm 將k8s大部分元件都容器化

Master節點:

- kube-apiserver

- controller-manager

- scheduler

- etcd

Node節點:

- kubelet

- kube-proxy

- Docker

kubelet、docker以systemd守護程序方式部署。

4、Kubernetes核心概念

Pod

Ÿ 最小部署單元

Ÿ 一組容器的集合

Ÿ 一個Pod中的容器共享網路名稱空間

Ÿ Pod是短暫的

Controller 控制器

Ÿ ReplicaSet:確保預期的Pod副本數量,多刪少起

Ÿ Deployment:無狀態應用部署

Ÿ StatefulSet:有狀態應用部署

Ÿ DaemonSet:確保所有Node運行同一個Pod

Ÿ Job:一次性任務

Ÿ Cronjob:定時任務

更高階層次物件,部署和管理Pod

Service

Ÿ 防止Pod失聯

Ÿ 定義一組Pod的訪問策略

由kube-proxy去實現的

Label:標籤附近到某個資源上,用於關聯物件、查詢和刷選

Namespace:名稱空間,將物件邏輯上隔離資源

kubernetes叢集部署、配置

  1. 生產環境部署k8s的2種方式
  2. 伺服器硬體配置推薦
  3. 使用kubeadm快速部署一個k8s叢集
  4. Kubectl命令列管理工具

生產環境部署k8s的2種方式

l Kubeadm

Kubernetes是一個工具,提供kubeadm init和kubeadm join 用於快速部署叢集,測試環境推薦方法

地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

l 二進位制

生產環境推薦,從官方下載發現版的二進位制包,手工部署每個組建,組成kubernetes叢集

下載地址:https://github.com/kubernetes/kubernetes/releases

1. 安裝要求

在開始之前,部署Kubernetes叢集機器需要滿足以下幾個條件:

l 一臺或多臺機器,作業系統 CentOS7.x-86_x64

l 硬體配置:2GB或更多RAM,2個CPU或更多CPU,硬碟30GB或更多

l 叢集中所有機器之間網路互通

l 可以訪問外網,需要拉取映象

l 禁止swap分割槽

2、準備環境(優化系統環境)

1、時間同步

echo "#time sync by fage at 2019-7-22" >>/var/spool/cron/root 

echo "*/5 * * * *  /usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1" >>/var/spool/cron/root

systemctl restart crond.service

2、關閉防火牆和selinux

systemctl stop firewalld 
systemctl disable firewalld 
sed -i s#SELINUX=enforcing#SELINUX=disable#g /etc/selinux/config
setenforce 0

3、更改主機名

更改master主機名

hostname k8s-master

echo "k8s-master" >/etc/hostname  

更改node主機名 node-1

hostname node-1

echo "node-1" >/etc/hostname 

更改node主機名 node-2

hostname node-2

echo "node-2" >/etc/hostname

4、更改hosts檔案(叢集機器都操作)

cat >/etc/hosts <<EOF

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.10.110 k8s-master

192.168.10.111 node-1

192.168.10.112 node-2

EOF

5、分發公鑰,每臺都要執行(非必須項)

ssh-keygen -t rsa -f /root/.ssh/id_rsa -P ""

ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]

ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]

ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]

6、全部節點node要禁用swap裝置 不禁用要在初始化配置宣告

swapoff -a   #臨時關閉

sed -i "s@/dev/mapper/centos-swap swap@#/dev/mapper/centos-swap swap@g" /etc/fstab    #永久關閉 

7、將橋接的IPv4流量傳遞到iptables的鏈:

cat > /etc/sysctl.d/k8s.conf << EOF

net.ipv4.ip_forward = 1

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

EOF

sysctl --system    #執行生效

3、全部機器安裝 Docker/kubeadm/kubelet/kubectl

Kubernetes預設CRI(容器執行時)為Docker,因此先安裝Docker。

3.1 安裝Docker(所有機器安裝)

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

yum -y install docker-ce-18.06.1.ce-3.el7         #也可以安裝19.03.4版本官方推薦
systemctl enable docker && systemctl start docker
docker --version

#docker映象加速器

cat > /etc/docker/daemon.json << EOF

{

  "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]

}

EOF

systemctl restart docker.service

docker info  

3.2 新增阿里雲YUM軟體源(所有機器操作)

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 

3.3 安裝kubeadm,kubelet和kubectl(所有機器操作)

由於版本更新頻繁,這裡指定版本號部署:

yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
systemctl enable kubelet.service 

4. 部署Kubernetes Master

在192.168.10.110(Master)執行。

kubeadm init \

  --apiserver-advertise-address=192.168.10.110 \

  --image-repository registry.aliyuncs.com/google_containers \

  --kubernetes-version v1.18.0 \

  --service-cidr=10.96.0.0/12 \

  --pod-network-cidr=10.244.0.0/16 \

  --ignore-preflight-errors=all

由於預設拉取映象地址k8s.gcr.io國內無法訪問,這裡指定阿里雲映象倉庫地址。

解釋含義:

--apiserver-advertise-address=192.168.10.110 \                  #呼叫API藉口的地址

--image-repository registry.aliyuncs.com/google_containers \    #下載映象的地址

--kubernetes-version v1.18.0 \                    #指定軟體的版本

--service-cidr=10.96.0.0/12 \                     #虛擬叢集的網路

--pod-network-cidr=10.244.0.0/16 \                #叢集節點中pod使用的網路

--ignore-preflight-errors=all                     #忽略所有初始化種遇到的錯誤資訊

初始化方法二:

或者使用配置檔案引導:

cat 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  

執行命令指定檔案即可

kubeadm init --config kubeadm.conf --ignore-preflight-errors=all

  

初始化完後需要建立程式配置資料夾、複製授權資訊配置檔案到目錄和授權

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

初始化過程執行的步驟說明

kubeadm init步驟:

1、[preflight] 環境檢查

2、[kubelet-start]  準備kubelet配置檔案/var/lib/kubelet/config.yaml並啟動

3、[certs]  證書目錄 /etc/kubernetes/pki

4、[kubeconfig] kubeconfig是用於連線k8s的認證檔案

5、[control-plane] 靜態pod目錄 /etc/kubernetes/manifests

6、[etcd] 靜態pod啟動etcd

7、[upload-config]  kubeadm-config儲存到kube-system configmap

8、[mark-control-plane] 給master節點打汙點,不讓pod分配

9、[bootstrap-token] 引導kubelet證書

10、[addons] 部署coredns和kube-proxy

  

5、網路方案(CNI)

1、Calico 推薦方案,支援網路策略

為什麼部署CNI網路?

部署CNI是為了不同主機之間的Pod進行通訊,因為kubernetes資源排程是需要通訊進行計算伺服器資源情況進行分配的

Calico是一個純三層的資料中心網路方案,Calico支援廣泛的平臺,包括Kubernetes、OpenStack等。

Calico 在每一個計算節點利用 Linux Kernel 實現了一個高效的虛擬路由器( vRouter) 來負責資料轉發,而每個 vRouter 通過 BGP 協議負責把自己上執行的 workload 的路由資訊向整個 Calico 網路內傳播。

此外,Calico  專案還實現了 Kubernetes 網路策略,提供ACL功能

下載官方預設配置檔案

https://docs.projectcalico.org/manifests/calico.yaml

下載完後還需要修改裡面配置項:

- 定義Pod網路(CALICO_IPV4POOL_CIDR),與前面初始化叢集網路pod CIDR配置一樣,後面叢集所有的pod都會使用這個網路進行分配地址

- 選擇工作模式(CALICO_IPV4POOL_IPIP),支援**BGP(Never)**、**IPIP(Always)**、**CrossSubnet**(開啟BGP並支援跨子網)

IPIP  隧道模式(overlay網路),基於乙太網基礎上承載容器資料表

BGP  純路由方案,要求在二層網路中,比較推薦的模式(對效能要求高的環境)

CrossSubnet 跨網段走IPIP,同網段走BGP

修改完後應用清單和檢視狀態:

kubectl apply -f calico.yaml

kubectl get pods -n kube-system 

2 Flannel 以前老版本推薦使用

Flannel是CoreOS維護的一個網路元件,Flannel為每個Pod提供全域性唯一的IP,Flannel使用ETCD來儲存Pod子網與Node IP之間的關係。

flanneld守護程序在每臺主機上執行,並負責維護ETCD資訊和路由資料包。

yaml下載地址:

https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml  

國外下載地址比較慢,可以考慮更換為國內的映象下載地址

部署完成網路後建立pod測試是否能夠正常訪問

kubectl create deployment nginx --image=nginx      #建立pod

kubectl expose deployment nginx --port=80 --type=NodePort    #將pod的叢集埠暴露外部訪問 

訪問地址:http://NodeIP:Port

部署管理叢集URL頁面

yaml下載地址,2.0版

https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml

  

預設Dashboard只能叢集內部訪問,修改Service為NodePort型別,暴露到外部:

vim recommended.yaml

 32 kind: Service
 33 apiVersion: v1
 34 metadata:
 35   labels:
 36     k8s-app: kubernetes-dashboard
 37   name: kubernetes-dashboard
 38   namespace: kubernetes-dashboard
 39 spec:
 40   type: NodePort
 41   ports:
 42     - port: 443
 43       targetPort: 8443
 44       nodePort: 30001
 45   selector:
 46     k8s-app: kubernetes-dashboard

生效檔案

kubectl apply -f recommended.yaml

kubectl get svc -n kubernetes-dashboard 

訪問地址:https://NodeIP:30001

建立service account並繫結預設cluster-admin管理員叢集角色:

kubectl create serviceaccount dashboard-admin -n kube-system  #建立使用者

kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin  #授權

kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')  #獲取token

到此部署完成