K8S基本概念視訊教學學習筆記
K8S基本概念-視訊教學-學習筆記
Rancher官方免費培訓視訊網址:
視訊時長:56分鐘
目錄:
1、配置Rancher和Kubernetes
2、K8S CLI: kubectl使用
3、容器組Pods
4、部署應用Deplotments
5、服務Services
6、配置管理Configmaps
7、負載均衡Ingresses
1、配置Rancher和Kubernetes
K8S電子書:概念介紹、部署擴容、升級監控等
3、容器組Pods
K8S的Pod概念:
-最小的排程單位
-包含一個或多個container
-每個pod有一個唯一的IP地址(不是每個容器有一個唯一的
-一個Pod中的容器可以通過localhost相互通訊(一個Pod中的多個容器共享網路、IPC等名稱空間)
-Pod中通常只有一個容器
-一般情況下,可以把Pod等同於Container
2、K8S CLI: kubectl
kubectl get node #獲取節點資訊
helm version #檢視helm工具版本,部署較麻煩
在Rancher的K8S CLI頁面中,
會自動生成kubectl命令列連線配置檔案,
可以複製,也可以下載,無需我們編輯,
將K8S的kubectl配置檔案的資訊存放到:~/.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
#檢視是否已經建立了一個新的
kubectl get pod
#進入到shell容器中,執行bash命令
kubectl exec -it shell bash
#編輯一個nginx Pod的yaml檔案
vim nginx-pod.yaml
#根據nginx-pod.yaml檔案的內容,建立一個nginx pod。
kubectl create -f nginx-pod.yaml
在K8S叢集的不同Pod的IP地址是相同網段的,他們之間是可以相互訪問的。
#訪問容器IP的80埠,看是否有輸出
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就可以處理這樣的情況,規定3個Pods,發現有一個失效,會自動再啟動一個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配置檔案中沒有的,模板和副本數量:replicas、template,
#在K8S中建立nginx-deployments
kubectl create -f nginx-deployment.yaml
#檢視deployments的資訊
kubectl get deployment
#刪除名為nginx-1234567-xyz的Pod
kubectl delete pod nginx-1234567-xyz
刪除Deployments所管轄的一個Pod,會自動再建立一個Pod。
使用kubectl命令,更改已經存在的Deployment資訊,比如擴充或減少Pod的數量
#將deployment/nginx的Pod數量由原來的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功能更強,
#比如修改了yaml中nginx映象的版本到新的版本,
#使用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相似
--K8S中Pod會消亡,並且不會自動起來,通過Deployments再起來的已經不是原來的Pod,而是新的Pod,Pod的IP也會發生改變,這時候就需要一個始終一致的端點,DNS指向不同的Pod的IP地址。
--一個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
該pod以Ubuntu映象為基礎,啟動後什麼也不做,
該pod使用了兩個配置變數,這兩個配置變數是儲存在test-cm這個ConfigMap中的。
#檢視Pod
kubectl get pod
#進入到Pod的shell中:
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 服務Service的yaml檔案,內容:
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
可以在其中一個pod的shell中,使用curl訪問 這個proxy:
curl proxy
(proxy是一個服務,會自動通過DNS進行解析,見前面的Service介紹)
這個示例proxy的作用是將所有80埠的訪問都轉向rancher.com
7、負載均衡Ingresses
ingresses
--定義K8S叢集之外的網路流量如何路由到叢集中的
--用來向外暴露K8S服務Service
--可以根據host,path等變數路由到內部服務。
--相當於一個7層轉發。
在Rancher搭建的K8S環境下,
會自動建立一個ingress Controller,無需自己再搭建。
Rancher會建立一個Rancher的LB,並把ingress的配置對映到Rancher的LB上,
在Rancher的K8S環境的基礎架構中,
會有一個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配置檔案中包含2個ingress配置,使用3個-分割!!3個-分割!!3個-分割!!
#根據上述yaml配置檔案,建立兩個ingress(一個名叫proxy、一個名叫nginx)
kubectl create -f ingress.yaml
#檢視剛才建立的ingress情況,包括名字、主機、IP地址、埠等
kubectl get ingress
兩個ingress將不同的外部埠訪問流量,導向不同的內部服務Service。
本示例中proxy服務將流量轉發到rancher.com網站,
本示例中nginx服務將流量轉發到叢集內的Deployments的Nginx上,
外部訪問-->RancherLB-->ingress-->service-->deployment-->pods
RancherLB(Rancher中的應用名稱為kubernetes-ingress-lbs:包含default-rancherlb-nginx、default-rancherlb-proxy,將流量分別導向K8S的兩個ingress:nginx和proxy)
參考網站:
K8S文件:
官方文件地址:
K8S電子書:概念介紹、部署擴容、升級監控等