# Kubernetes (三) - 實戰 Pod 建立 上一篇我們介紹了如何安裝和啟動 Kubernetes,這一篇要來實際的操作 Kubernetes。本篇會介紹如何從最基本的 Pod 開始建立。 <!-- more --> ## 建立 Pod 在 [Kubernetes (一) - 基本概念](https://tienyulin.github.io/kubernetes-concept/) 中有介紹過 Pod 是 Kubernetes 運作的最小單位,所以我們要先從建立 Pod 開始。 而要在 Pod 中運行的程式本篇使用 [potainer](https://hub.docker.com/r/portainer/portainer) 作為範例,portainer 是一種 Docker UI 的管理工具。 在 [Kubernetes (一) - 基本概念](https://tienyulin.github.io/kubernetes-concept/) 中也有提到每個 Pod 都有屬於自己的 yaml 檔,yaml 檔是用來描述這個 Pod,包含 Pod 的名稱、有哪些 Container 等等。 ### 建立 Pod 的 yaml 檔 基本的 Pod yaml 檔格式和內容如下 : ```yaml= apiVersion: v1 kind: Pod metadata: name: <myapp> labels: name: <myapp> spec: containers: - name: <myapp> image: <Image> resources: limits: memory: "128Mi" cpu: "500m" ports: - containerPort: <Port> ``` kind : 定義這個元件的類別,例如 : Pod、Node、Service、Namespace 或是 ReplicationController。 metadata : 定義這個元件的名稱和他的標籤名稱,標籤可以自訂給多組,例如 : name, app, env 等等。給標籤的用處是可以用來篩選出 Pod,這會在後面介紹的 Service 中再細說。 spec : 定義 Container * containers.name : Container 名稱 * containers.image : 使用的 Image * containers.resources : 硬體資源限制,可以不設定 * containers.ports : 開放給外部存取的 Port 號 **範例** 下面是一個 Pod 的 yaml 檔範例,會啟動一個 potainer 的 Container。 `kubernetes-pod.yml` ```yaml= apiVersion: v1 kind: Pod metadata: name: kubernetes-pod labels: name: k8s-pod spec: containers: - name: portainer image: portainer/portainer:latest resources: limits: memory: "128Mi" cpu: "500m" ports: - containerPort: 9000 ``` ### 使用 Pod 的 yaml 檔建立 Pod 使用 kubectl 的 `create` 指令建立 Pod。 ```bash= kubectl create -f <file name>.yml ``` **範例** 使用剛才建立好的 `kubernetes-pod.yml` 來建立 Pod。 ```bash= $ kubectl create -f kubernetes-pod.yml pod/kubernetes-pod created ``` 建立好後可以使用 kubectl 的 `get pods` 指令查看 Pod 建立的狀況。 ```bash= $ kubectl get pods NAME READY STATUS RESTARTS AGE kubernetes-pod 1/1 Running 0 15s ``` 也可以使用 kubectl 的 `describe pods <pod name>` 指令查看 Pod 的詳細資訊。 ```bash= $ kubectl describe pods kubernetes-pod Name: kubernetes-pod Namespace: default Priority: 0 Node: minikube/172.17.0.2 Start Time: Mon, 24 Aug 2020 20:39:59 +0800 Labels: name=k8s-pod Annotations: <none> Status: Running IP: 172.18.0.6 IPs: IP: 172.18.0.6 Containers: portainer: Container ID: docker://82f110f3582eb53ca1d6fe1d3637bb5bea9ffd5a365673f2b691aa4e769d7b0e Image: portainer/portainer:latest Image ID: docker-pullable://portainer/portainer@sha256:f8c2b0a9ca640edf508a8a0830cf1963a1e0d2fd9936a64104b3f658e120b868 Port: 9000/TCP Host Port: 0/TCP State: Running Started: Wed, 26 Aug 2020 20:54:13 +0800 Last State: Terminated Reason: Error Exit Code: 1 Started: Wed, 26 Aug 2020 20:44:12 +0800 Finished: Wed, 26 Aug 2020 20:49:13 +0800 Ready: True Restart Count: 421 Limits: cpu: 500m memory: 128Mi Requests: cpu: 500m memory: 128Mi Environment: <none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from default-token-s82gq (ro) Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True Volumes: default-token-s82gq: Type: Secret (a volume populated by a Secret) SecretName: default-token-s82gq Optional: false QoS Class: Guaranteed Node-Selectors: <none> Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s node.kubernetes.io/unreachable:NoExecute for 300s Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning BackOff 8m15s (x3428 over 2d) kubelet, minikube Back-off restarting failed container ``` ### 連線到 Pod 中啟動的服務 在 Pod 中所指定的 Port 和主機的 Port 是不相通的,只能在 Kubernetes Cluster 中被存取,所以 Kubernetes 提供了 port-forward 這個指令來將主機的 Port 對應到 Pod 的 Port #### port-forward 可以使用 kubectl 的 `port-forward ` 指令將主機的 Port 對應到 Pod 的 Port。 ```bash= kubectl port-forward <pod name> <host port>:<pod port> ``` **範例** portainer 預設是使用 9000 Port 來進行通訊,所以上方 `kubernetes-pod.yml` 也是定義對外開放的 Port 是 9000。因次這裡就再將主機的 9000 Port 對應的 Pod 的 9000 Port。 ```bash= $ kubectl port-forward kubernetes-pod 9000:9000 Forwarding from 127.0.0.1:9000 -> 9000 Forwarding from [::1]:9000 -> 9000 ``` 設定完後在瀏覽器輸入 http://localhost:9000 就可以成功打開 portainer。  ## Summary 本篇介紹了如何建立基本的 Pod 和如何從外部連線到 Kubernetes Cluster 內的 Pod,下一篇將會介紹進階的一些功能來更方便的管理和擴展 Pod。 ## 參考 [1] [在 Minikube 上跑起你的 Docker Containers - Pod & kubectl 常用指令](https://ithelp.ithome.com.tw/articles/10193232) [2] [Kubernetes 基礎教學(二)實作範例:Pod、Service、Deployment、Ingress](https://medium.com/@C.W.Hu/kubernetes-implement-ingress-deployment-tutorial-7431c5f96c3e) [3] [Kubectl常用命令](https://support.huaweicloud.com/usermanual-cce/cce_01_0139.html) [4] [Kubernetes學習筆記2 — pod及service](https://medium.com/@wrre/kubernetes%E5%AD%B8%E7%BF%92%E7%AD%86%E8%A8%982-%E5%BB%BA%E7%AB%8B%E8%87%AA%E5%B7%B1%E7%9A%84pod-a240f8a00a40) [5] [Kubernetes Service 概念詳解](https://tachingchen.com/tw/blog/kubernetes-service/) [6] [建立外部服務與Pods的溝通管道 - Services](https://ithelp.ithome.com.tw/articles/10194344) [7] [Kubernetes Service | 知乎](https://zhuanlan.zhihu.com/p/137370051) [8] [Day 16 - Kubernetes Label 與 Selector](https://ithelp.ithome.com.tw/articles/10204939?sc=iThelpR) [9] [Port, TargetPort, and NodePort in Kubernetes](https://matthewpalmer.net/kubernetes-app-developer/articles/kubernetes-ports-targetport-nodeport-service.html) [10] [Kubernetes kubectl expose](http://docs.kubernetes.org.cn/475.html) ###### tags: `Container` `Kubernetes`
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up