# 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
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.