docker和kubernetes簡單使用手記

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。

naison@naison-TM1701:~/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

所以我的實驗數據沒法兒展示。

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: apps/v1
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的名字
spec:
  selector: # 這裏定義了一個選擇器,要和pods的選擇器值相同纔可以被匹配上
    app: MyNginx
  ports:
    - protocol: TCP
      port: 8080 #這裏是service暴露出去的端口
      targetPort: 80 # 這裏是對內pods的端口

6.4,創建ingress,對公網提供服務。cat nginx-ingress.yaml

apiVersion: networking.k8s.io/v1beta1
kind: Ingress # 類型,有很多
metadata:
  name: ingress-test
spec:
  rules:
  - host: foo.bar.com # 外網的域名,會打到內部的service --> pods
    http:
      paths:
      - backend:
          serviceName: nginx-service # 這裏對應我們的服務名稱,也就是servcie name
          servicePort: 80 # 服務的端口

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格式的。

8,補充

8.1,Dockerfile的編寫,需要區分run cmd exec三個類型的區別

8.2,docker出來的鏡像可以不用推到https://registry-1.docker.io/這個網站上去,自己用的話,放在本地就可以。但是鏡像拉取策略要改爲:IfNotPresent,本地沒有才會從遠端倉拉取。

8.3,學習k8s最好的方式就是看官方文檔,支持中文。https://kubernetes.io/zh/docs/home/,並且需要手動實踐。

8.4,對於開發來說,docker和k8s是偏運維一點兒的。但是多瞭解一點兒知識總是沒壞處的。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章