今天紀錄是如何建立Pod、Service、Deployment,這些都是kubernetes常見的元件也是最基礎的原件。後面還會參雜指令的功能。另外有關yaml的部分我就不在這裡寫介紹了。
Kubernetes運作的最小單位,一個服務會在一個Pod內。
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']
kubectl apply -f pod_demo.yaml #這行是如果有改yaml就會將改後的yaml取代當前執行的yaml,如果沒有存在這個yaml就會創建。
#或
kubectl create -f pod_demo.yaml #直接創建yaml所寫的資源,不會覆蓋當前資源
查看pod是否有Running
kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 1/1 Running 0 3m52s
可以查看pod詳細內容,看有沒有成功。
# kubectl describe pod <pod的NAME>
kubectl describe pod myapp-pod
使用log看資訊,因我的yaml會輸出Hello Kubernetes!,所以可以看看log有沒有這行。
# kubectl logs <pod的NAME>
kubectl logs myapp-pod
Service的作用就是讓Cluster中的Pod與外部互相溝通。ps:我的範例並沒有通過label去連接Pod,這裡只有單純的創建和查詢,所以只有看Service有沒有被創建。
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9376
---
apiVersion: v1
kind: Service
metadata:
name: mydb
spec:
ports:
- protocol: TCP
port: 89
targetPort: 9377
kubectl apply -f service_test.yaml
#或是
kubectl create -f service_test.yaml
kubectl get service
#或著
kubectl get svc
查看全部Service詳細資訊
kubectl describe service
#或著
kubectl describe svc
查看指定的Service詳細資訊
kubectl describe service <Service的NAME>
#或著
kubectl get svc <Service的NAME>
Deployment為pod和replicaset提供了設定的方式,官方也說Pod和replicaset推薦使用Deployment來部屬會比較好,Deployment有著同步、滾動更新、回滾等功能。這裡也是只有簡單的範例。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
kubectl apply -f deployment_test.yaml
kubectl get pod
除了剛剛測試的pod外,我在deployment_test.yaml內的replicas設定了3,因此會有三個pod。
#kubectl delete pod <pod的NAME>
kubectl delete pod nginx-deployment-54f57cf6bf-9j6vk
查看pod會發現,新生成了一個Pod,因為replicas為3代表deployment產生的pod會保持三個,當有crash或是被刪除一個會再重啟一個pod,以保持三個pod的情況。
當我跟改了deployment內pod的設定,他不會馬上將所有pod更改,會先保留當前的版本,然後再去建立新版本的pod,當確定新版本的pod的成功Running後會再將舊的pod刪除。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.8.1
ports:
- containerPort: 80
kubectl apply -f deployment_test.yaml
kubectl get pod