本文描述一個用Kubernetes搭建的簡單集群的單service案例,基本來源於慕課網。本案例包含兩台主機共個節點,結構如下圖所示。
一、安裝
安裝過程參考:https://github.com/gjmzj/kubeasz/blob/master/docs/quickStart.md
其中,針對第三步的安裝,需要將“ssh-copy-id $IP”替換為:
cat id_rsa.pub >> /root/.ssh/authorized_keys
同時,在hosts中將[kube-node]設置為本機ip,將[kube-node]設置為slave節點的ip。這樣就將本機指定為了集群的master節點。
安裝完成后,通過"ssh 本機ip"登錄本機,就可以進行各種操作了。
通過get nodes操作獲取集群節點信息。
kubectl get nodes
用get pods操作查看集群的pod是否都正常運行:
kubectl get pods --all-namespaces
get操作還能獲得很多其他的集群信息,包括services、pods、deployments等。可以用kubectl get --help查看。
二、部署service
Kubernetes通過yaml文件定義各種對象。部署service也是通過yaml文件進行的。
1.編寫hello-service.yaml:
apiVersion: v1 kind: Service metadata: name: hello-service spec: type: NodePort selector: app: hello-k8s-demo ports: - protocol: TCP port: 80 targetPort: 8080 nodePort: 30008
上面是配置部署service的一個標准的yaml文件。
apiVersion即文件使用的api版本。
kind即對象的類型(部署service時為Service)。
metadata是元數據,這里規定了service的名稱。
spec代表對象的具體屬性。
type規定為NodePort時,下面的nodePort需要為節點指定監聽的端口。
selector規定了將請求打到具有標簽app=hello-k8s-demo的pod上。
最后的ports下面規定了一組port的屬性。
port代表service暴露的虛擬端口為80。
targetPort代表后端pod監聽在8080端口。
2.創建service
kubectl create命令創建service:
kubectl create -f hello-service.yaml --record=true
這樣service就創建成功了。可以用kubectl get service查看剛創建的服務,或者用kubectl describe命令查看詳細信息:
kubectl describe service/hello-service
三、部署Deployment
Kubernetes一般通過部署deployment實現對pod的配置,同樣通過yaml文件。
1.編寫hello-deployment.yaml文件
apiVersion: apps/v1 kind: Deployment metadata: name: hello-deployment labels: app: hello-k8s-demo spec: replicas: 2 selector: matchLabels: app: hello-k8s-demo template: metadata: labels: app: hello-k8s-demo spec: containers: - name: hello-k8s image: bigwhite/hello-kubernetes-demo:v0.1 imagePullPolicy: Always ports: - containerPort: 8080
在metadata中為deployment打上了此應用的標簽。
在spec中,規定了replica(即pod的個數)為2。
后面template的意思是,當pod的個數低於前面規定的replica的個數時,要求deployment按照此template創建pod以補全個數。
模板中必須規定label且必須與前面的selector一致。
后面為template定義了容器的信息,即新創建的pod需要封裝哪些容器。這里規定了容器的名字、鏡像、拉取策略、以及pod暴露的端口。
2.創建deployment
仍然通過kubectl create -f創建deployment。之后可以用kubectl get deployment查看基本信息。
再次運行kubectl describe service,可以發現在endpoints欄增加了新創建的兩個pod的ip地址。
這時,從本機或者從機訪問本機或者從機的ip地址的30008端口的hello路由,都可以看到輸出了hello, kubernetes!的字樣:
curl [本機ip或從機ip]:30008/hello
3.監控pod運行情況
通過kubectl get pods命令,可以查看到剛創建的pod信息。發現兩個pod被分配到了兩個節點上。
將pod的名字復制,使用kubectl logs -f [pod名],可以對pod的狀態進行監控。
新建兩個窗口,分別對兩個pod執行logs操作。多次發送curl請求,可以發現,請求被負載均衡到了兩個pod下。
三、擴展pod的數量
修改hello-deployment.yaml文件內容,將replica改為3。
通過kubectl apply -f hello-deployment.yaml命令,使修改生效。
通過get pods查看pod信息,可以發現pod數量已經增加為3個。
四、服務版本升級和回退
修改hello-deployment.yaml文件內容,將鏡像版本改為v0.2,通過apply命令使其生效。
在升級過程中,Kubernetes會用新pod逐一替換舊pod。
可以用rollout undo命令對升級進行快速回滾:
kubectl rollout undo deployment/hello-deployment
(主要來源於https://www.imooc.com/learn/978)