經過上文的創建文件測試可以感受到,通過run命令啟動容器非常麻煩。其中docker提供了compose解決了這個問題,而kubernetes使用kubectl create命令就可以做到和compose一樣的效果,該命令可以通過配置文件快速創建一個集群資源對象。
1、部署Deployment
創建一個名為nginx-deployment.yml的配置文件,以創建nginx服務為例進行說明
注意:各版本配置文件內容有所不同,具體請參照官方文檔。
(例:v1.15版本apiVersion為extensions/v1beta1,在v1.16在這個版本中Deployment已經從extensions/v1beta1 棄用,更改為apps/v1)。
#API 版本號
apiVersion: apps/v1
#類型,如:Pod/ReplicationController/Deployment/Service/Ingress
kind: Deployment
#元數據
metadata:
#Kind 的名稱
name: nginx-app
spec:
selector: #定義標簽選擇器
matchLabels:
app: nginx
#部署的實例數量
replicas: 2
template:
metadata:
labels:
#容器標簽的名字,發布 Service 時,selector 需要和這里對應
app: nginx
spec:
#配置容器,數組類型,說明可以配置多個容器
containers:
#容器名稱
- name: nginx
#容器鏡像,不能使用latest
image: nginx:1.17
imagePullPolicy: IfNotPresent
#暴露端口
ports:
#Pod 端口
- containerPort: 80
鏡像拉取策略,支持三種ImagePullPolicy:
- Always:不管鏡像是否存在都會進行一次拉取
- Never:不管鏡像是否存在都不會進行拉取
- IfNotPresent:只有鏡像不存在時才會拉取鏡像
注意:
- 默認為IfNotPresent,而latest標簽的鏡像默認為Always
- 拉取鏡像時docker會進行校驗,如果鏡像中的MD5沒有變化,則不會拉取鏡像數據
- 生產環境中應該避免使用latest標簽,而開發環境可以借助latest標簽自動拉取最新的鏡像
創建資源對象
[root@yn101-22 service]# kubectl create -f nginx-deployment.yml
#輸出如下:
deployment.apps/nginx-app created
#查看Pods狀態
[root@yn101-22 service]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-app-798dcc9989-vs862 1/1 Running 0 3m47s
nginx-app-798dcc9989-xzg4x 1/1 Running 0 3m47s
#查看已部署的服務
[root@yn101-22 service]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-app 2/2 2 2 4m20s
#查看已發布的服務
[root@yn101-22 service]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 12h
2、部署Service
以上配置僅部署了服務,還未運行容器,因此,需要發布服務配置。先停止上一步部署的Deployment
[root@yn101-22 service]# kubectl delete -f nginx-deployment.yml
#輸出如下:
deployment.apps "nginx-app" deleted
創建一個名為nginx.yml的配置文件,完整配置內容如下:
#API 版本號
apiVersion: apps/v1
#類型,如:Pod/ReplicationController/Deployment/Service/Ingress
kind: Deployment
#元數據
metadata:
#Kind 的名稱
name: nginx-app
spec:
selector: #定義標簽選擇器
matchLabels:
app: nginx
#部署的實例數量
replicas: 2
template:
metadata:
labels:
#容器標簽的名字,發布 Service 時,selector 需要和這里對應
app: nginx
spec:
#配置容器,數組類型,說明可以配置多個容器
containers:
#容器名稱
- name: nginx
#容器鏡像,不能使用latest
image: nginx:1.17
imagePullPolicy: IfNotPresent
#暴露端口
ports:
#Pod 端口
- containerPort: 80
---
apiVersion: v1
kind: Service #指明資源類型是 service
metadata: #元數據
name: nginx-http #kind的名稱
spec:
ports:
- port: 80 #service暴露的端口
targetPort: 80 #pod上的端口,將service暴露的短句轉發到pod端口上
type: LoadBalancer
selector:
app: nginx #需要和上面部署的deployment標簽名對應
創建資源對象
[root@yn101-22 service]# kubectl create -f nginx.yml
#輸出如下
deployment.apps/nginx-app created
service/nginx-http created
#查看已發布的服務
[root@yn101-22 service]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 13h
nginx-http LoadBalancer 10.106.43.210 <pending> 80:30665/TCP 93s
由上可知,服務暴露端口為30665,在node節點進行驗證服務是否啟動成功。
分別訪問node-01節點(192.168.101.31:30665)和node-02節點(192.168.101.32:30665),能正常訪問nginx說明啟動服務成功。
刪除服務
[root@yn101-22 ~]# kubectl delete -f nginx.yml
#輸出如下:
deployment.apps "nginx-app" deleted
service "nginx-http" deleted