1. 程式人生 > >K8S基本概念視訊教學學習筆記

K8S基本概念視訊教學學習筆記

K8S基本概念-視訊教學-學習筆記

Rancher官方免費培訓視訊網址:

視訊時長:56分鐘

目錄:

1、配置RancherKubernetes

2K8S CLI: kubectl使用

3、容器組Pods

4、部署應用Deplotments

5、服務Services

6、配置管理Configmaps

7、負載均衡Ingresses

1、配置RancherKubernetes

K8S電子書:概念介紹、部署擴容、升級監控等

3、容器組Pods

K8SPod概念:

-最小的排程單位

-包含一個或多個container

-每個pod有一個唯一的IP地址(不是每個容器有一個唯一的

IP地址,Rancher中每個容器有一個IP地址)

-一個Pod中的容器可以通過localhost相互通訊(一個Pod中的多個容器共享網路、IPC等名稱空間)

-Pod中通常只有一個容器

-一般情況下,可以把Pod等同於Container

2K8S CLI: kubectl

kubectl get node  #獲取節點資訊

helm version   #檢視helm工具版本,部署較麻煩

RancherK8S CLI頁面中,

會自動生成kubectl命令列連線配置檔案,

可以複製,也可以下載,無需我們編輯,

K8Skubectl配置檔案的資訊存放到:~/.kube/config

這樣就可以在shell中使用kubectl命令列工具連線到K8S

可以通過複製,然後vi工具中貼上

vi ~/.kube/config

這樣在安裝kubectl命令列工具的機器上,

就可以去連線到和管理K8S叢集了,

這是Rancher帶來的方便之處。

如何使用kubectl命令列建立一個Pod?

先用vi工具,編輯一個yaml檔案,檔名隨意,檔案內容需要參考資料。

#編輯一個shell-pod.yaml檔案

vim shell-pod.yaml

#使用剛剛建立的yaml檔案,建立一個pod-f引數指定一個檔案

kubectl create -f shell-pod.yaml  

#檢視是否已經建立了一個新的

Pod,獲得Pod狀態

kubectl get pod   

#進入到shell容器中,執行bash命令

kubectl exec -it shell bash   

#編輯一個nginx Podyaml檔案

vim nginx-pod.yaml  

#根據nginx-pod.yaml檔案的內容,建立一個nginx pod

kubectl create -f nginx-pod.yaml    

K8S叢集的不同PodIP地址是相同網段的,他們之間是可以相互訪問的。

#訪問容器IP80埠,看是否有輸出

curl 10.42.x.x

#檢視nginx pod 的詳細詳細,非常詳細!

kubectl describe pod nginx   

#編輯一個複雜的Pod配置檔案,

#包括版本、型別、名字,映象、埠、環境變數、資料卷、網路等

vim full-pod.yaml  

full.pod.yaml檔案內容:

apiVersion: v1

kind:Pod

metadata:

  name:full

spec:

  containers:

  - name:full

    image:nginx

    ports:

      - containerPort:80

    env:

      - name:EXAMPLE_ENV_VARIABLE

        value:example_value

    volumemounts:

      -mountPath:/container-dir

       name:example-volume

  volumes:

    - name:example-volume

      hostPath:

         path:/host-dir

  nodeSelector:

      disktype:ssd

  hostNetwork:true

以上配置檔案與docker-compose.yml非常類似

4、部署應用Deplotments

Deployments:(部署應用)

- Pods之上的一層抽象

- 定義一組Pods期望的數量和狀態

- 通常不直接執行Pods,而是使用Deployments

  (在Docker中,通常不直接使用容器,而是使用服務)

  (一個服務包含多個容器,可以動態擴充和收縮資源)

  K8S也是一樣的,Deployments對應Service

- 一臺機器宕機,其上的Pod也消失,該Pod不會自動在其他機器上啟動。

- Deployments就可以處理這樣的情況,規定3Pods,發現有一個失效,會自動再啟動一個Pod

vim nginx-deployment.yaml  #編輯一個deployment配置檔案:

apiVersion:extensions/vibeta1

kind:Deployment

metadata:

  name:nginx

spec:

  replicas:3

  template:

    metadata:

      labels:

        app:nginx

    spec:

      containers:

      - name:nginx

        image:nginx:1.12

        ports:

        - containerPort:80

Deployments的配置檔案中,可以定義Pod的配置,包含的關係

還可以定義Pod配置檔案中沒有的,模板和副本數量:replicastemplate

#K8S中建立nginx-deployments

kubectl create -f nginx-deployment.yaml

#檢視deployments的資訊

kubectl get deployment   

#刪除名為nginx-1234567-xyzPod

kubectl delete pod nginx-1234567-xyz   

刪除Deployments所管轄的一個Pod,會自動再建立一個Pod

使用kubectl命令,更改已經存在的Deployment資訊,比如擴充或減少Pod的數量

#deployment/nginxPod數量由原來的3個調整為2

kubectl scale deployment/nginx --replicas=2   

#再次檢視Pod狀態,可以發現已經自動少了一個nginx-1234567-xxx Pod

kubectl get pod   

kubectl edit deployment nginx  

#啟動vi編輯器,修改deployment nginx 的配置檔案,

可以將Deployments nginx中的Pods數量replicas 改為3

#像編輯vi一樣,儲存退出以後,再檢視Pod數量,

發現已經自動增加運行了一個Pod

kubectl get pod

kubectl apply -f nginx-deployment.yaml  

#根據yaml配置檔案的內容,更新Deployments,比create功能更強,

#比如修改了yamlnginx映象的版本到新的版本,

#使用kubectl apply -f nginx-deployment.yaml後,

#會自動刪除原有的Pods,並建立新的Pods

#檢視某個Pod的詳細資訊

kubectl describe pod [nginx-pod-name]  

#檢視某個deployment的詳細定義檔案,其中包含了狀態,可以用來對比

kubectl get deployment nginx -o yaml   

Replication Controller & Replica Set

--不要為他們操心,

--交由Deployments自動建立和管理,

--之前的K8S版本使用這些功能,用於維護Pod的數量,新的版本都不用了

#獲取 Replica Set的數量

kubectl get rs  

5、服務Services

Services

--有一個唯一的DNS名字(DNS entry

--為一組Pods提供始終一致的端點

--功能上和Loadbalancer相似

--K8SPod會消亡,並且不會自動起來,通過Deployments再起來的已經不是原來的Pod,而是新的PodPodIP也會發生改變,這時候就需要一個始終一致的端點,DNS指向不同的PodIP地址。

--一個Service關聯一組Pods,每次訪問Service,會將請求傳送給其中一個Pod

vim nginx-service.yaml   

#編輯一個nginx-service.yaml檔案,定義一個nginx service,內容如下:

kind:Service

apiVersion:v1

metadata:

  name:nginx

spec:

  selector:

    app:nginx

  ports:

    - name:main

      protocal:TCP

      port:8080

      targetPort:80

    - name:secondary

      protocal:TCP

      port:80

      targetPort:80

#根據yaml檔案的定義,建立一個nginx服務

kubectl create -f nginx-service.yaml

#檢視服務(包括名稱、叢集IP、外部IP、埠等)

kubectl get svc   

再建立一個同網段的Shell容器,使用Curl工具訪問域名,

curl nginx.default.svc.cluster.local:8080

curl nginx.default.svc.cluster.local:80   

#同樣也可以訪問,因為在yaml檔案中,定義了兩個埠

通過檢視/etc/resolv.conf 域名配置檔案,

我們可以看到自動包含了以下域名:

nameserver 10.43.0.x

search default.svc.cluster.local svc.cluster.local cluster.local kubelet.kubernetes.rancher.internal kubernetes.rancher.internal rancher.internal

因為包含以上幾個搜尋域,

所以可以直接使用curl nginx來替代長的域名

curl nginx

curl nginx.default.svc.cluster.local

這兩種方法都可以訪問相同的服務Service

6、配置管理Configmaps

Configmaps

--用來做配置管理的,儲存配置引數和配置檔案

--可以作為環境變數暴露給Pod使用

--可以作為本地儲存的方式暴露給Pod使用

vi test-cm.yaml  

#編輯一個Configmaps配置檔案,內容如下:

apiVersion:v1

kind:ConfigMap

metadata:

  name:test-cm

data:

  key1:value1

  key2:value2

#根據配置檔案,建立ConfigMap 配置變數。

kubectl create -f test-cm.yaml   

#檢視configmap配置變數,只顯示test-cm名字,不顯示鍵值內容

kubectl get configmap  

建立好了configmap配置變數以後,我們可以在其他的pod中引用

vim cm-as-env.yaml  

#再建立一個Pod,應用test-cm配置變數中的鍵值,檔案內容:

apiVersion:v1

kind:Pod

metadata:

  name:env-cm-pod

spec:

  containers:

    - name:test-container

      image:ubuntu

      command:["sleep","infinity"]

      env:

        - name:PRIMARY_KEY

          valueFrom:

            configMapKeyRef:

              name:test-cm

              key:key1

        - name:SECONDARY_KEY

          valueFrom:

            configMapKeyRef:

              name:test-cm

              key:key2

kubectl create -f cm-as-env.yaml   

#根據上述配置內容,建立容器env-cm-pod

podUbuntu映象為基礎,啟動後什麼也不做,

pod使用了兩個配置變數,這兩個配置變數是儲存在test-cm這個ConfigMap中的。

#檢視Pod

kubectl get pod   

#進入到Podshell中:

kubectl exec -it env-cm-pod bash

env   

#檢視系統變數,可以看到這個Pod中有PRIMARY_KEY=value1這個變數以及SECONDARY_KEY=value2

另一種configmap儲存配置方式:cm-as-volume

vi cm-as-volume.yaml   

#編輯一個configmap配置檔案cm-as-volume.yaml

通過本地儲存的方式獲取configmap,內容如下:

apiVersion:v1

kind:Pod

metadata:

  name:volume-cm-pod

spec:

  containers:

    - name:test-container

      image:ubuntu

      command:["sleep","infinity"]

      volumeMounts:

        - name:config-volume

          mountPath:/etc/config

  volumes:

    - name:config-volume

      configMap:

        name:test-cm

#根據yaml檔案建立volume-cm-pod

kubectl create -f cm-as-volume.yaml   

#檢視Pod

kubectl get pod  

#進入到volume-cm-pod shell中檢視

kubectl exec -it volume-cm-pod bash  

在容器中檢視/etc/config目錄

ls /etc/config   

#可以看到該目錄下有key1/key2檔案

cat /etc/config/key1  #顯示key1檔案的內容,即變數的值

cat /etc/config/key2  #顯示key2檔案的內容,即變數的值

檔名==

檔案內容=

configmap 的作用:

多個deployments需要用到相同的一組配置引數,就不需要重複,可以利用configmap的功能來實現,減少維護的負擔。

在使用Nginx映象時,如果配置檔案比較複雜,

通常把配置檔案mount進容器中去。

docker run --name mynginx -p 8080:80 -v /host/path/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx

K8S環境下,不能直接mount一臺主機目錄到容器中去,因為K8S是叢集的概念,不知道容器執行在那臺主機上,不能直接對映某臺主機的目錄到容器中。

可以把nginx的配置寫到configmap中,在需要時,直接從configmap中去拿配置資訊。

舉例:有一個nginx的配置檔案:default.conf檔案,配置內容:

server{

    listen80;

    server_namelocalhost;

    location / {

        proxy_pass http://rancher.com/;

    }

    error_page  500 502 503 504 /50x.html;

    location * /50x.html {

        root   /usr/share/nginx/html;

    }

}

重要的命令:

自動的從一個配置檔案建立configmap 配置檔案!!!configmap的名字為proxy-cm

kubtctl create configmap proxy-cm --from-file=default.conf

#檢視生成的yaml檔案是這個樣子的:

kubectl get configmap proxy-cm -o yaml

##**kubectl命令列中使用 -o yaml引數檔案,以yaml檔案的形式顯示。

在這個yaml檔案中,這是一個configmap yaml檔案,

key是檔名

value是檔案的內容

vim proxy-deployment.yaml  

#在部署檔案中,引用儲存在configmap中的nginx的配置檔案,內容如下:

apiVersion:extensions/v1beta1

kind:Deployment

metadata:

  name:proxy

spec:

  replicas:2

  template:

    metadata:

      labels:

        app:proxy

    spec:

      containers:

        - name:proxy

          image:nginx:1.12

          ports:

          - containerPort:80

          volumeMounts:

          - name:config-volume

            mountPath:/etc/nginx/conf.d/

      volumes:

        - name:config-volume

          configMap:

            name:proxy-cm

kubectl create -f proxy-deployment.yaml   

#建立一個Deployments,在其中引用configmap配置檔案。

vim proxy-service.yaml  

#建立一個proxy 服務Serviceyaml檔案,內容:

kind:Service

apiVersion:v1

metadata:

  name:proxy

spec:

  selector:

    app:proxy

  ports:

    - protocal:TCP

      port:80

      targetPort:80

#建立這個proxy Service:

kubectl create -f proxy-service.yaml

定義的服務名稱叫 proxy

可以在其中一個podshell中,使用curl訪問 這個proxy:

curl proxy

(proxy是一個服務,會自動通過DNS進行解析,見前面的Service介紹)

這個示例proxy的作用是將所有80埠的訪問都轉向rancher.com

7、負載均衡Ingresses

ingresses

--定義K8S叢集之外的網路流量如何路由到叢集中的

--用來向外暴露K8S服務Service

--可以根據hostpath等變數路由到內部服務。

--相當於一個7層轉發。

Rancher搭建的K8S環境下,

會自動建立一個ingress Controller,無需自己再搭建。

Rancher會建立一個RancherLB,並把ingress的配置對映到RancherLB上,

RancherK8S環境的基礎架構中,

會有一個kubernetes-ingress-lbs

可以將網路之外的流量匯入到K8S叢集的Pod內。

#建立一個ingress示例,內容如下:

vim ingress.yaml  

apiVersion:extensions/v1beta1

kind:Ingress

metadata:

  name:proxy

  annotations:

    http.port:"9000"

spec:

  backend:

    serviceName:proxy

    servicePort:80

---

apiVersion:extensions/v1beta1

kind:Ingress

metadata:

  name:nginx

  annotations:

    http.port:"9001"

spec:

  backend:

    serviceName:nginx

    servicePort:80

以上一個yaml配置檔案中包含2ingress配置,使用3-分割!!3-分割!!3-分割!!

#根據上述yaml配置檔案,建立兩個ingress(一個名叫proxy、一個名叫nginx)

kubectl create -f ingress.yaml   

#檢視剛才建立的ingress情況,包括名字、主機、IP地址、埠等

kubectl get ingress  

兩個ingress將不同的外部埠訪問流量,導向不同的內部服務Service

本示例中proxy服務將流量轉發到rancher.com網站,

本示例中nginx服務將流量轉發到叢集內的DeploymentsNginx上,

外部訪問-->RancherLB-->ingress-->service-->deployment-->pods

RancherLB(Rancher中的應用名稱為kubernetes-ingress-lbs:包含default-rancherlb-nginxdefault-rancherlb-proxy,將流量分別導向K8S的兩個ingressnginxproxy)

參考網站:

K8S文件:

官方文件地址:

K8S電子書:概念介紹、部署擴容、升級監控等