Kubernetes 概述
kubernetes 是什么
- kubernetes 是 Google 在 2014年開源的一個容器集群管理平台,kubernetes簡稱 k8s
- k8s用於容器化應用程序的部署,擴展和管理。
- k8s提供了容器的編排,資源調度,彈性伸縮,部署管理,服務發現等一系列功能
- kubernetes目標是讓部署容器化應用簡單高效
Kubernetes 特性
-
自我修復
- 在節點故障時重新啟動失敗的容器,替換和重新部署,保證預期的副本數量;殺死健康檢查失敗的容器,並且在未准備好之前不會處理客戶端請求,確保線上服務不中斷。
-
伸縮性
- 使用命令、UI或者基於CPU使用情況自動快速擴容和縮容應用程序實例,保證應用業務高峰並發時的高可用性;業務低峰時回收資源,以最小成本運行服務。
-
自動部署和回滾
- K8S采用滾動更新策略更新應用,一次更新一個Pod,而不是同時刪除所有Pod,如果更新過程中出現問題,將回滾更改,確保升級不受影響業務。
-
服務發現和負載均衡
- K8S為多個容器提供一個統一訪問入口(內部IP地址和一個DNS名稱),並且負載均衡關聯的所有容器,使得用戶無需考慮容器IP問題。
-
機密和配置管理
- 管理機密數據和應用程序配置,而不需要把敏感數據暴露在鏡像里,提高敏感數據安全性。並可以將一些常用的配置存儲在K8S中,方便應用程序使用。
-
存儲編排
- 掛載外部存儲系統,無論是來自本地存儲,公有雲(如AWS),還是網絡存儲(如NFS、GlusterFS、Ceph)都作為集群資源的一部分使用,極大提高存儲使用靈活性。
-
批處理
- 提供一次性任務,定時任務;滿足批量數據處理和分析的場景。
Kubeadm 概述
kubeadm是Kubernetes項目自帶的及集群構建工具,負責執行構建一個最小化的可用集群以及將其啟動等的必要基本步驟,kubeadm是Kubernetes集群全生命周期的管理工具,可用於實現集群的部署、升級、降級及拆除。kubeadm部署Kubernetes集群是將大部分資源以pod的方式運行,例如(kube-proxy、kube-controller-manager、kube-scheduler、kube-apiserver、flannel)都是以pod方式運行。
Kubeadm僅關心如何初始化並啟動集群,余下的其他操作,例如安裝Kubernetes Dashboard、監控系統、日志系統等必要的附加組件則不在其考慮范圍之內,需要管理員自行部署。
Kubeadm集成了Kubeadm init和kubeadm join等工具程序,其中kubeadm init用於集群的快速初始化,其核心功能是部署Master節點的各個組件,而kubeadm join則用於將節點快速加入到指定集群中,它們是創建Kubernetes集群最佳實踐的“快速路徑”。另外,kubeadm token可於集群構建后管理用於加入集群時使用的認證令牌(token),而kubeadm reset命令的功能則是刪除集群構建過程中生成的文件以重置回初始狀態。
Kuberadm 離線部署 k8s 集群
架構圖

環境規划
| 操作系統 | IP | CPU/MEM | 主機名 | 角色 |
|---|---|---|---|---|
| CentOS 7.7-x86_64 | 192.168.1.14 | 2/4G | k8s-master | Master |
| CentOS 7.7-x86_64 | 192.168.1.15 | 2/4G | k8s-node1 | Work node |
| CentOS 7.7-x86_64 | 192.168.1.16 | 2/4G | k8s-node2 | Work node |
【軟件包版本號】
| name | version |
|---|---|
| Docker | 3:19.03.13 |
| kubeadm | v1.18.6 |
| kubernetes | v1.18.6 |
安裝前提條件
- Centos 7.x 最小化安裝
- 時鍾同步
下載離線程序包
更新修復,請下載 k8s-kubeadmin.zip 壓縮包!!!
鏈接:https://pan.baidu.com/s/1Q3jbJcgq0rH8jK-LTpa6Vg
提取碼:hhhh
部署Master節點
- 執行自動安裝腳本
將下載到的程序包拷貝到 k8s-master 節點解壓,我這里的master節點是 192.168.1.14
[root@localhost ~]# ip a | egrep global
inet 192.168.1.14/24 brd 192.168.1.255 scope global noprefixroute eth0
[root@localhost ~]# ls
anaconda-ks.cfg k8s-kubeadm.tar.gz
[root@localhost ~]# tar xf k8s-kubeadm.tar.gz
[root@localhost ~]# cd k8s-kubeadm
[root@localhost k8s-kubeadm]# ls
docker-ce-19.03.12.tar.gz flannel-v0.12.0-linux-amd64.tar.gz install.sh k8s-imagesV1.18.6.tar.gz k8s-V1.18.6.tar.gz kube-flannel.yml packages.tar.gz
# 執行腳本 ./install.sh [主機名]
[root@localhost k8s-kubeadm]# ./install.sh k8s-master
等待腳本執行自動安裝。。。
執行完畢后,會出現以下提示:

因為內核進行了升級,請重啟服務器。

重啟以后,內核版本更新為 5.8.13
- 使用 kubeadm 初始化集群
kubeadm init --kubernetes-version=v1.18.6 --apiserver-advertise-address=192.168.1.14 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12
等待集群初始化完成。。。

kubeadm join 192.168.1.14:6443 --token utml0h.gj2nafii8xm1512e \
--discovery-token-ca-cert-hash sha256:e91fb35667cf51c76b9afa288e4416a1314a1244158123ffbcee55b7ac4a70d4
上面命令記錄下來,這是將 node 節點加入到 集群的執行操作命令。
出現如上提示,集群初始化成功,執行提示命令:
[root@k8s-master ~]# mkdir -p $HOME/.kube
[root@k8s-master ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master ~]# chown $(id -u):$(id -g) $HOME/.kube/config
使用 kubectl 查看 nodes
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady master 74s v1.18.6
- 初始化網絡插件 flannel
# 進入壓縮后的目錄里
[root@k8s-master ~]# cd k8s-kubeadm/
# 開始進行 flannel 初始化安裝
[root@k8s-master k8s-kubeadm]# kubectl apply -f kube-flannel.yml
podsecuritypolicy.policy/psp.flannel.unprivileged created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
flannel 初始化完成后,查看 nodes 狀態:
[root@k8s-master k8s-kubeadm]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 3m58s v1.18.6
到此,通過 kubeadm 初始化安裝 master 節點完畢。接下來是 node 節點就很簡單。
部署node節點
- 將下載的壓縮包拷貝到 node 節點執行
[root@k8s-master ~]# scp k8s-kubeadm.tar.gz 192.168.1.15:/root/
------以下node節點執行------
[root@localhost ~]# ls
anaconda-ks.cfg k8s-kubeadm.tar.gz
[root@localhost ~]# tar xf k8s-kubeadm.tar.gz
[root@localhost ~]# cd k8s-kubeadm/
# ./install.sh 主機名
[root@localhost k8s-kubeadm]# ./install.sh k8s-node1
這里和上面 master 初始化一樣,完成后重啟主機。

- 重啟完成后,執行 join 命令加入集群
# 就是上面記錄的命令
kubeadm join 192.168.1.14:6443 --token utml0h.gj2nafii8xm1512e \
--discovery-token-ca-cert-hash sha256:e91fb35667cf51c76b9afa288e4416a1314a1244158123ffbcee55b7ac4a70d4

- 切換到 k8s-master 查看 k8s-node1 是否加入集群

k8s-node1 成功加入集群,剩下的 node 節點都是一樣的操作。
到此,通過 kubeadm 搭建 k8s 環境已經完成。
k8s 集群簡單測試
注意:本節測試需要網絡拉取鏡像,可以通過網絡將 鏡像拷貝到主機里 所需鏡像: nginx:alpine / busybox
這里做一個簡單的小測試來證明集群是健康正常運行的。
- 創建一個 nginx pod
[root@k8s-master ~]# kubectl run nginx-deploy --image=nginx:alpine
pod/nginx-deploy created
[root@k8s-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deploy 1/1 Running 0 11s
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deploy 1/1 Running 0 18s 10.244.1.2 k8s-node1 <none> <none>
- 為 nginx pod 創建一個服務
[root@k8s-master ~]# kubectl expose pod nginx-deploy --name=nginx --port=80 --target-port=80 --protocol=TCP
service/nginx exposed
[root@k8s-master ~]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 21m
nginx ClusterIP 10.106.14.253 <none> 80/TCP 9s
[root@k8s-master ~]# curl 10.106.14.253
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
- 創建一個 busybox pod 來通過 nginx 服務名訪問
[root@k8s-master ~]# kubectl run client --image=busybox -it
If you don't see a command prompt, try pressing enter.
------ 通過服務名來訪問 nginx 服務 ------
/ # wget -O - -q nginx
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
/ # cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
測試通過,網絡及dns服務正常。集群處於正常健康狀態。
