K8s從入門到精通
- 一、Docker背景和K8s介紹
- 1.1 應用部署方式演變
- 1.2 K8s介紹
- 1.3 K8s組件
- 1.4 K8s概念
- 二、集群環境搭建
一、Docker背景和K8s介紹
1.1 應用部署方式演變
| 部署方式 | 傳統部署 | 虛擬化部署 | 容器化部署 |
|---|---|---|---|
| 概念 | 直接將應用部署在物理機上 | 在一臺物理機上運行多個虛擬機,每個虛擬機是一個獨立的環境 | 與虛擬機類似,但是共享了作業系統 |
| 優點 | 簡單 | 應用環境不會相互影響,有一定的安全性 | 保證每個容器有自己的檔案系統、CPU、記憶體等 |
| 缺點 | 很難合理分配資源,一個程式導致內容泄露會影響別的程式 | 增加了作業系統,浪費資源 | / |
三種應用部署方式如下圖所示,容器化部署方式,相較于虛擬機部署,不需要新建作業系統,直接復用宿主機的作業系統,

當然,容器化部署也會存在一些問題,比如:
- 一個容器故障停機,如何讓另一個容器立刻啟動去替補;
- 當并發訪問量變大,如何橫向擴展容器數量?
這些問題統稱為“容器編排”問題,為解決這些容器編排問題,有一些容器編排工具:
- Swarm:Docker自己的容器編排工具
- Mesos:Apache的一個資源統一管控工具,需要和Marathon結合使用
- K8s:谷歌開源的容器編排工具(OpenShift和Rancher是k8s的封裝)
1.2 K8s介紹
K8s的本質是一組“服務器集群”,可以在集群的每個節點(服務器)上運行特定的程式,來對節點中的容器進行管理,主要有這些功能:
- 自我修復:某個容器崩潰,能夠在一秒內迅速啟動新的容器;
- 彈性伸縮:自動對集群中正在運行的容器數量進行調整;
- 服務發現:通過自動發現的形式找到它所依賴的服務;
- 負載均衡:如果一個服務啟動了多個容器,能夠自動實作請求的負載均衡(輪詢)
- 版本回退:如果新發布的程式版本有問題,可以立即回退到原來的版本
- 存盤編排:可以根據容器自身的需求自動創建存盤卷
1.3 K8s組件
1個K8s集群主要是由控制節點(master)、作業節點(node)組成,
master:集群的控制平面,負責集群的決策
- ApiServer:資源操作的唯一入口
下面,以部署一個nginx服務來說明kubernetes系統各個組件呼叫關系:
- 首先要明確,一旦kubernetes環境啟動之后,master和node都會將自身的資訊存盤到etcd資料庫中
- 一個nginx服務的安裝請求會首先被發送到master節點的apiServer組件
- apiServer組件會呼叫scheduler組件來決定到底應該把這個服務安裝到哪個node節點上
- 在此時,它會從etcd中讀取各個node節點的資訊,然后按照一定的演算法進行選擇,并將結果告知apiServer
- apiServer呼叫controller-manager去調度Node節點安裝nginx服務
- kubelet接收到指令后,會通知docker,然后由docker來啟動一個nginx的pod,pod是kubernetes的最小操作單元,容器必須跑在pod中,
- 自此,一個nginx服務就運行了,如果需要訪問nginx,就需要通過kube-proxy來對pod產生訪問的代理,這樣,外界用戶就可以訪問集群中的nginx服務了,
1.4 K8s概念
二、集群環境搭建

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.60.100:6443 --token v5hiib.lh23uvi2mokbdo1u \
--discovery-token-ca-cert-hash sha256:2b4f7e703ae46606b4d0e7945098c3e0450baf8914eb93d059456096b559b0c7
[root@master ~]#
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady master 6m2s v1.17.4
在kubernetes安裝網路插件flannel時,需要下載一個kube-flannel.yml檔案,并且要修改其中的quay.io倉庫為quay-mirror.qiniu.com,
[root@master ~]# kubectl apply -f kube-flannel.yml
但是在實際操作時,發現這個網站已經無法使用了,導致flannel相關鏡像下載不成功,主控節點和作業節點的狀態沒有變成NotReady,
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady master 44m v1.17.4
node1 NotReady <none> 36m v1.17.4
node2 NotReady <none> 35m v1.17.4
// 可以看到關于flannel的幾個鏡像狀態都是Init:ImagePullBackOff,說明沒有安裝成功
[root@master ~]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-6955765f44-pjg4n 0/1 Pending 0 46m
coredns-6955765f44-q5zwc 0/1 Pending 0 46m
etcd-master 1/1 Running 0 46m
kube-apiserver-master 1/1 Running 0 46m
kube-controller-manager-master 1/1 Running 0 46m
kube-flannel-ds-amd64-9pmhp 0/1 Init:ImagePullBackOff 0 5m11s
kube-flannel-ds-amd64-hclff 0/1 Init:ImagePullBackOff 0 5m11s
kube-flannel-ds-amd64-jxlhp 0/1 Init:ImagePullBackOff 0 5m11s
kube-proxy-grc4m 1/1 Running 0 46m
kube-proxy-qwj96 1/1 Running 0 37m
kube-proxy-xt2zl 1/1 Running 0 38m
kube-scheduler-master 1/1 Running 0 46m
采用下面的命令查看其中一個flannel鏡像的詳細資訊,可以看到quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64鏡像拉取失敗,
[root@master ~]# kubectl describe pod kube-flannel-ds-amd64-9pmhp -n kube-system
****
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 9m10s default-scheduler Successfully assigned kube-system/kube-flannel-ds-amd64-9pmhp to master
Normal Pulling 7m35s (x4 over 9m9s) kubelet, master Pulling image "quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64"
Warning Failed 7m35s (x4 over 9m9s) kubelet, master Failed to pull image "quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64": rpc error: code = Unknown de sc = Error response from daemon: Get https://quay-mirror.qiniu.com/v2/: dial tcp: lookup quay-mirror.qiniu.com on 223.5.5.5:53: no such host
Warning Failed 7m35s (x4 over 9m9s) kubelet, master Error: ErrImagePull
Normal BackOff 7m6s (x7 over 9m8s) kubelet, master Back-off pulling image "quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64"
Warning Failed 4m9s (x20 over 9m8s) kubelet, master Error: ImagePullBackOff
怎么解決呢?此時需要到github手動下載flannel:v0.11.0-amd64鏡像,
https://github.com/flannel-io/flannel/releases/tag/v0.11.0
下載完成后,加載鏡像,
[root@master ~]# docker load < flanneld-v0.11.0-amd64.docker
7bff100f35cb: Loading layer [==================================================>] 4.672MB/4.672MB
5d3f68f6da8f: Loading layer [==================================================>] 9.526MB/9.526MB
9b48060f404d: Loading layer [==================================================>] 5.912MB/5.912MB
3f3a4ce2b719: Loading layer [==================================================>] 35.25MB/35.25MB
9ce0bb155166: Loading layer [==================================================>] 5.12kB/5.12kB
Loaded image: quay.io/coreos/flannel:v0.11.0-amd64
注意,加載的鏡像標簽是“quay.io/coreos/flannel:v0.11.0-amd64”,需要將kube-flannel.yml檔案中的倉庫還原為quay.io,保持原樣,否則還是會有問題,這是一個坑,幫大家踩了,
// 首先需要洗掉配置
[root@master ~]# kubectl delete -f kube-flannel.yml
// 然后重新加載
[root@master ~]# kubectl apply -f kube-flannel.yml
// 重啟
[root@master ~]# systemctl restart kubectl
完成上面的步驟后,在查看作業節點狀態,可以看到,兩個節點的狀態已經變成了Ready!!各種鏡像也基本沒有問題,實名批評一下,現在論壇上的很多經驗都過時了,根本沒有參考價值,
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 25h v1.17.4
node1 Ready <none> 25h v1.17.4
node2 NotReady <none> 25h v1.17.4
[root@master ~]# kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-6955765f44-pjg4n 1/1 Running 0 25h
kube-system coredns-6955765f44-q5zwc 1/1 Running 0 25h
kube-system etcd-master 1/1 Running 0 25h
kube-system kube-apiserver-master 1/1 Running 0 25h
kube-system kube-controller-manager-master 1/1 Running 0 25h
kube-system kube-flannel-ds-amd64-5nqst 1/1 Running 0 65s
kube-system kube-flannel-ds-amd64-5xqvq 0/1 Init:0/1 0 65s
kube-system kube-flannel-ds-amd64-jx8j6 1/1 Running 0 65s
kube-system kube-proxy-grc4m 1/1 Running 0 25h
kube-system kube-proxy-qwj96 1/1 Running 0 25h
kube-system kube-proxy-xt2zl 1/1 Running 0 25h
kube-system kube-scheduler-master 1/1 Running 0 25h
ENJOY~

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/289237.html
標籤:其他
上一篇:mysql基礎知識總結(面試)
下一篇:簡單聊聊負載均衡的那些事
