在上一篇中,我們學習了使用minikube來搭建k8s集群。k8s集群啟動后,就可以在上面部署應用了。本篇,我們就來學習如何使用kubectl在k8s上部署應用。學習之前,可以先從下面這篇博客上了解到部署方式有多種:
關於kubernetes的部署方式:Kubernetes的幾種主流部署方式01-minikube部署
關於minikube和kubeadm部署方式的區別可以參考:Kubernetes的幾種主流部署方式02-kubeadm部署高可用集群
官方文檔:Using kubectl to Create a Deployment (Hello Minikube)
一、創建deployment
1.使用kubectl create命令創建一次部署,該部署用於管理Pod
kubectl create deployment hello-node --image=gcr.io/hello-minikube-zero-install/hello-node
![]()
2.查看部署
kubectl get deployments
![]()
3.查看pod
kubectl get pods
![]()
4.查看集群事件
kubectl get events

5.查看kubectl配置
kubectl config view

二、對外暴露服務
默認情況,pod僅能在集群內網中通過內網ip訪問。如果要通過外網訪問,需要將pod暴露成kubernetes服務。
暴露服務
1.使用kubectl expose命令將pod暴露到公網
kubectl expose deployment hello-node --type=LoadBalancer --port=8080
The --type=LoadBalancer flag indicates that you want to expose your Service outside of the cluster.
![]()
2.查看服務
[peng@cent99 ~]$ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-node LoadBalancer 10.101.254.43 <pending> 8080:31492/TCP 3d19h kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d17h
3.查看下對外暴露的端口(NodePort選項)
[peng@cent99 ~]$ kubectl describe services/hello-node Name: hello-node Namespace: default Labels: app=hello-node Annotations: <none> Selector: app=hello-node Type: LoadBalancer IP: 10.101.254.43 Port: <unset> 8080/TCP TargetPort: 8080/TCP NodePort: <unset> 31492/TCP Endpoints: Session Affinity: None External Traffic Policy: Cluster Events: <none>
4.
minikube service hello-node
??這個我沒有成功,彈出瀏覽器后無法訪問??
使用標簽
部署會自動為pod創建一個標簽,使用describe deploymen命令可以查看標簽的名稱

我們用這個標簽來查詢pod列表
[peng@cent99 ~]$ kubectl get pods -l app=hello-node NAME READY STATUS RESTARTS AGE hello-node-55b49fb9f8-s2x8f 0/1 ImagePullBackOff 0 3d19h
同樣,我們可以使用這個標簽來查詢service列表
[peng@cent99 ~]$ kubectl get services -l app=hello-node NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-node LoadBalancer 10.101.254.43 <pending> 8080:31492/TCP 3d19h
使用kubectl label命令創建新標簽
[peng@cent99 ~]$ export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}') [peng@cent99 ~]$ echo Name of the Pod: $POD_NAME Name of the Pod: hello-node-55b49fb9f8-s2x8f [peng@cent99 ~]$ kubectl label pod $POD_NAME run=v1 pod/hello-node-55b49fb9f8-s2x8f labeled
使用新創建的標簽來查詢
[peng@cent99 ~]$ kubectl get pods -l run=v1 NAME READY STATUS RESTARTS AGE hello-node-55b49fb9f8-s2x8f 0/1 ImagePullBackOff 0 3d20h
三、查看Pod和Node的信息
- 共享的存儲, 例如Volumes
- 網絡, 例如唯一的集群ip地址
- 每個容器如何運行相關的一些信息,例如容器鏡像的版本或者使用的唯一端口

Pod總是運行在Node中,Node可以是一台物理機,也可以是虛擬機。每個Pod都由Master管理,一個Node可以操縱多個Pod。Master會自動調度集群中跨節點的Pod,Master的自動調度會考慮每個節點上的可用資源。
每個節點都至少會運行Kubelet和容器運行時。
- Kubelet, a process responsible for communication between the Kubernetes Master and the Node; it manages the Pods and the containers running on a machine.
- A container runtime (like Docker, rkt) responsible for pulling the container image from a registry, unpacking the container, and running the application.

下面的kubectl命令可以完成大多數常用的操作:
- kubectl get - 列出資源
- kubectl describe - 顯示資源詳情
- kubectl logs - 打印pod中的容器的日志
- kubectl exec - 向pod中的容器執行命令
通過這些命令,我們可以查看應用何時部署,當前運行狀態,運行位置,和相關的配置信息
查看資源對象
kubectl get
#查看所有pod列表
kubectl get pods
#查看rc列表
kubectl get rc
#查看service列表
kubectl get service
描述資源對象詳細信息
kubectl describe
#顯示node的詳細信息 kubectl describe nodes [node名] #顯示pod的詳細信息 kubectl describe pods/[pod名] #顯示由RC管理的pod的信息 kubectl describe pods [rc名]
執行容器的命令
kubectl exec
#執行pod的date命令,默認使用pod中的第1個容器執行 kubectl exec <pod名> date #指定pod中某個容器執行date命令 kubectl exec <pod名> -c <容器名> date #登錄容器執行命令 kubectl exec -it <pod名> -c <容器名> /bin/bash
查看容器的日志
kubectl logs
#查看容器輸出到stdout的日志 kubectl logs <pod名> #跟蹤查看容器的日志,相當於tail -f命令的結果 kubectl logs -f <pod名> -c <容器名>
