1,前言
最經很多加班,是以沒時間寫部落格,說的我好像有時間就會寫部落格一樣~~,做下知識輸出吧,關于docker和kubernetes的。
2,關于docker
關于docker,我有一篇簡單的博文,大家可以參考一下我之前寫的,雖然恨水,但是入門就行。今天主要是介紹一下kubernetes的,簡稱k8s,這個是google出的一個服務治理,編排的工具,可以輕松實作springboot中的服務治理,注冊發現等邏輯。
3,關于kebernetes
下面介紹一下k8s和docker的關系,他倆的關系就是一個是容器,一個是容器的外圍。也就是docker是跑我們具體的業務邏輯的,比如我們把自己的jar包,寫個dockerfile,打成鏡像,用docker跑起來。k8s是管理這些跑起來的服務的外圍工具,比如要做叢集,那就開啟一個replicaset,如果資源不夠,可以把叢集的機器減少數量,最大的特性在于,可以把處于不同的實體機器(k8s中稱為nodes)上的服務編排為一組或者多組服務,通過namespace聲明不同的空間,這些不同的空間,就構成了一組獨立的服務,當然了跨namespace也是可以資源共享的,然後這組服務内部的nodes就會不斷的通信以達到同步的目的。
4,踩坑記錄
首先我們需要一台安裝了kubernetes的linux機器。大家可以嘗試在ubuntu上安裝microk8s,這個是ubuntu推薦的單主機時的解決方案,https://ubuntu.com/kubernetes/install#single-node,大家可以上去瞄一瞄。
4.1,需要啟動dns,指令:microk8s.enable dns,否則報錯資訊:
Warning MissingClusterDNS 21s (x5 over 3m13s) kubelet, naison-tm1701 pod: "nginx-deployment-7b8fddc8f6-hg28v_my-zone(3b9d9cd6-dc22-4a1f-b369-364208e78447)". kubelet does not have ClusterDNS IP configured and cannot create Pod using "ClusterFirst" policy. Falling back to "Default" policy.
4.2,solution:暫無。報錯資訊:
Warning FailedCreatePodSandBox 33s (x4 over 2m43s) kubelet, naison-tm1701 Failed to create pod sandbox: rpc error: code = Unknown desc = failed to get sandbox image "k8s.gcr.io/pause:3.1": failed to pull image "k8s.gcr.io/pause:3.1": failed to pull and unpack image "k8s.gcr.io/pause:3.1": failed to resolve reference "k8s.gcr.io/pause:3.1": failed to do request: Head "https://k8s.gcr.io/v2/pause/manifests/3.1": dial tcp 64.233.188.82:443: i/o timeout
說是拉取鏡像k8s.gcr.io/pause:3.1失敗。原因是看起來很簡單,被長城給牆了。網上的解決方案為:從mirrorgooglecontainers的倉拉取,docker tag一下,但是我嘗試了多次,還是不行,shit。
[email protected]:~/Desktop$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
k8s.gcr.io/pause 3.1 da86e6ba6ca1 2 years ago 742kB
mirrorgooglecontainers/pause 3.1 da86e6ba6ca1 2 years ago 742kB
是以我的實驗資料沒法兒展示。
4.3,補充:建議還是使用vmware workstation安裝centos,再安裝kubernetes和docker,具體可以參考:
https://blog.51cto.com/douya/1945382
https://linuxacademy.com/community/show/15747-error-creating-kubernetes-pod-no-api-token-found-for-service-acc/
這兩篇部落格
5,基本概念
雖然沒法兒看實驗資料,但是該說的還的說。(現在就可以補圖了)
5.1,大體概念需要了解,k8s中的資源都是可以定義的,通過yaml檔案定義。
5.2,pods是最小的容器,也就是我們的業務在pods裡邊。
deployment:是管理容器的控制器,可以管理這一組pods的狀态。
service:是提供一組服務的入口,可以看成是網關或者負載均衡,通過service對外提供服務,對内将請求打到pods上。
ingress:是對外網提供服務的入口,這裡可以配置域名。也就是外網 --> ingress --> service --> pods
selector:是标簽選擇器,維護關系使用,常用在service和pods這一組關系中。
endpoint:是端點,可以手動指定将某一個pods連結到service上
namespace:是指令空間,也就是資源隔離使用的。多個實體機(nodes)可以通過邏輯概念namespace劃分不同的服務。
6,常見yaml
這裡我會列出四個常用的資源yaml,這四個yaml就完整的定義了從公網到服務端的一個完整鍊路。即:
公網 --> ingress --> service --> pods。
6.1,nginx-namespace.yaml,作用是建立一個namespace
apiVersion: v1
kind: Namespace
metadata:
name: my-zone
6.2,建立使用控制器deployment建立pods,nginx-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
namespace: my-zone # 這裡聲明了namespace和c/c++的名空間作用一樣
labels:
app: nginx # 這個是deployment本身的标簽
spec:
replicas: 3 # 複制集數量,也就是pods叢集數量,啟動pods的個數
selector:
matchLabels:
app: MyNginx #deployment通過這個标簽來查找要管理的pods
template: # 建立出來的pods都是按照這個模闆建立出來的
metadata:
labels:
app: MyNginx #這裡是建立出來的pods的标簽
spec: # 規格
containers:
- name: nginx-test # 這裡是内部容器pods的名稱,後邊會加上一串數
image: nginx:latest # 這裡是說pods的鏡像位址,我們可以自己打包上傳到docker registry,本地需要配置docker.conf檔案,賬号和密碼
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80 # 這裡是内部pods的運作端口,也就是服務端口,比如如果是redis就是6379,mysql就是3306
6.3,建立service,對namespace提供服務。nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service # 這個service的名字
namespace: my-zone
spec:
selector: # 這裡定義了一個選擇器,要和pods的選擇器值相同才可以被比對上
app: MyNginx
ports:
- protocol: TCP
port: 8080 #這裡是service暴露出去的端口
targetPort: 80 # 這裡是對内pods的端口
6.4,建立ingress,對公網提供服務。cat nginx-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress # 類型,有很多
metadata:
name: ingress-test
namespace: my-zone
spec:
rules:
- host: test.com # 外網的域名,會打到内部的service --> pods
http:
paths:
- backend:
serviceName: nginx-service # 這裡對應我們的服務名稱,也就是servcie name
servicePort: 8080 # 服務的端口
7,常用指令
指令格式:kubectl 操作方式 資源類型 {資源名/可選參數} 命名空間 {導出格式/可選參數}
操作方式:get/describe/delete
資源類型: all,pods,servcies,ingress,deployment,config等等
資源名:一般來說格式為:類型 - 一串字元 - 一串字元 - 一串字元...
命名空間:-A,所有namespace, --namespace my-zone, my-zone指令空間内的資源
導出格式:-o yaml/ -o json,json沒有試過,但是按道理來說應該是支援的。
example:
kubectl get all -A # 擷取所有namespace下面的所有資源
kubectl get pods --namespace my-zone # 擷取my-zone namespace下面的pods
kubectl get pods --namespace my-zone -o yaml # 擷取my-zone namespace下面的pods
kubectl describe ingress ingress-121213123213 --namespace my-zone # 檢視詳情
kubectl logs pods/pods-121213123213 --namespace my-zone # logs稍微特别一點兒,可以看見标準輸出,錯誤輸出等。
操作yaml檔案指令:
kubectl apply/create/delete -f xxx.yaml
apply --可用于更新和建立
create --建立
delete --删除
備注: 其實檔案字尾不一定非要是yaml,别的名字也可以,隻是格式内容需要是yaml格式的。