iT邦幫忙

2023 iThome 鐵人賽

DAY 29
0
DevOps

從0開始學習DevOps,並部署CICD至Java專案中系列 第 29

Kubernetes的組成與相關指令操作、新增Ingress並取得連線

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20231014/20162058OGcjSRkiIp.png

(圖片引用自官方)

K8s的組成元件

Container 容器

將所需要的程式碼、套件、執行檔、組態檔等等內容進行封裝在一起的獨立容器,具有隔離性且輕量,確保應用程序可以在不同環境中一致。

Pod 部署單位 (官方說明)

為 Kubernetes 中創建和管理的、最小的可部署的單元,在K8s中會運行不同種類的應用程式,一個Pod相當於一個應用程式,在一個Pod內部可以包含1~多個的container,同一個Pod裡面的container內會共享相同的網路資源。

  • 共享網路命名空間:相同的IP位址
  • 共享生命週期:pod內的容器會一起啟動或終止。

Node 節點(官方說明)

Node 是 Kubernetes 集群中的工作機器,就像是一台虛擬機,這個節點負責管理其中的pod以及pod當中的container。
K8s會自診斷這個節點是否為可運行狀態,不然集群活動中都會忽略不健康狀態的Node。
Node 名稱必須是合法的 DNS 子域名

Node 的主要组成部分包括:

  • Kubelet: 每個結點上運行的代理,負責與 Master 節點通信,以確保 Pod 中的容器處於運行狀態。
  • Docker/Container Runtime: 是在 Node 上運行容器的工具,如 Docker。
  • Kube Proxy: 是一個網絡代理,負責維護節點上的網絡規則,實現 Pod 之間的通信和負載均衡。
  • Pod: Node 上實際運行的工作負載,可以包含一個或多個容器。

基本指令相關操作

  • kubectl config get-contexts:取得目前有哪些集群

https://ithelp.ithome.com.tw/upload/images/20231014/20162058gyJPOA3c3I.png

  • kubectl config use-context <context_name>:選擇使用哪一個集群
  • kubectl apply -f <file_name>:運行一個檔案
  • kubectl get nodes:取得目前有哪些節點

https://ithelp.ithome.com.tw/upload/images/20231014/201620587Roh0JiC7i.png

  • kubectl get pods:取得目前有哪些部署單位。(默認是查看default namespace項下的pods)

https://ithelp.ithome.com.tw/upload/images/20231014/20162058EEMWH0VZzK.png

  • kubectl get pods -A:取得目前有哪些部署單位(不限定namespace)。

https://ithelp.ithome.com.tw/upload/images/20231014/20162058ZHbqdbMPrW.png

  • kubectl get pod -n <name>:指定查看某一個namespace中有哪些pod

https://ithelp.ithome.com.tw/upload/images/20231014/20162058PtzIqod2G8.png

  • kubectl get namespace:取得目前有哪些命名空間

https://ithelp.ithome.com.tw/upload/images/20231014/20162058PsTcUQqsae.png

  • kubectl create ns <name>:創建一個命名空間

https://ithelp.ithome.com.tw/upload/images/20231014/20162058CZ5nNLYTnq.png

  • kubectl run <自定義name> --image=<image_name>:<tag>:啟動一個pod(會以指定的image以及版本來啟動這個pod)

    這邊預設是會先使用docker從DockerHub中拉取image下來,再使用這個image run 構建出一個pod。(使用 docker images 也會看到自己多了一個 nginx的image)

https://ithelp.ithome.com.tw/upload/images/20231014/20162058S0rIJQ1nwP.png

當有啟動pod之後,在dashboard也可以看到相關訊息

https://ithelp.ithome.com.tw/upload/images/20231014/20162058du1J3495Y8.png

點選pod名稱,就可以看到這個pod的詳細資訊

https://ithelp.ithome.com.tw/upload/images/20231014/201620583IQiYIbL1U.png

  • kubectl delete pos <image_name> -n <namespace_name>:刪除一個在指定的namespace中的image。
  • kubectl describe pod <pod_name>:查看pod的詳細資訊(default namespace)

https://ithelp.ithome.com.tw/upload/images/20231014/20162058GMIhroFmri.png

  • kubectl describe pod -n <namespace_name> <pod_name>:查看指定namespace的pod的詳細資訊。(如果namespace不是default,就需要指定

https://ithelp.ithome.com.tw/upload/images/20231014/20162058wLDstXMgg0.png

  • kubectl logs -n <namespace_name> <pod_name>取得指定的namespace的指定pod的log

一個pod如何運行多個container?

建立一個yml檔案,撰寫要使用到的image及相關配置,使用 kubectl apply -f <file_name>.yml 執行,就會在k8s的namespace下創建一個名為nginx-tomcat的pod,而這個pod中的image使用的是nginx:latest以及tomcat:latest。

(這邊一樣會是從docker pull image下來)

類似於docker-compose的概念。

apiVersion: v1
kind: Pod
metadata:
  name: nginx-tomcat
  namespace: k8s
spec:
  containers:
    - image: nginx:latest
      name: nginx
    - image: tomcat:latest
      name: tomcat

https://ithelp.ithome.com.tw/upload/images/20231014/20162058UPuBxNOfdY.png

Deployments / Service / Ingress

  • 工作負載資源 - Deployments 部署:可以一次啟動多個 Pod。(官方說明)
  • 服務 - Service:可以透過Service API 向外暴露 Pod中的應用,可用ip連接。(官方說明)
  • Ingress:對集群中Service的外部訪問進行管理(官方說明)

https://ithelp.ithome.com.tw/upload/images/20231014/20162058ND8mNSFyNJ.png

練習新增一組Deployment / Service / Ingress,app-test.yaml

Deployment 區塊

  • 創建一個Deployment命名為my-app,且設定副本(replicas)數量為1。
  • 配置一個Pod模板(template),使用nginx:latest image,制定容器端口號為80。

Service 區塊

Service 監聽端口8090,並轉發到Pod的80端口。
使用 selector 將 Service 與 Deployment 中的 Pod 關聯。
type: NodePort:表示會隨機指定一個端口號供外部連接,也可以使用nodePort: 30000指定端口。

Ingress 區塊

透過Ingress域名 tw.app.com暴露資源在外,會映射service的8090端口。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: nginx:latest
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  selector:
    app: my-app
  ports:
  - protocol: TCP
    port: 8090
    targetPort: 80
  type: NodePort
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app-ingress
spec:
  ingressClassName: ingress
  rules:
    - host: tw.app.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: my-app-service
                port:
                  number: 8090

執行:kubectl apply -f app-test.yaml

取得Service的連線資訊:kubectl get service my-app-service

https://ithelp.ithome.com.tw/upload/images/20231014/20162058QwmRN5i1O2.png

嘗試連接看看是否成功

使用 http://localhost:32600/ 連接,看到以下頁面就表示連接成功囉!

https://ithelp.ithome.com.tw/upload/images/20231014/20162058wAywcSewDJ.png

也可改變本地映射Ingress host名稱

mac 使用 sudo nano /etc/hosts 進到檔案編輯環境,把127.0.0.1本地拜訪的ip,改為host名稱

https://ithelp.ithome.com.tw/upload/images/20231014/20162058XAPNpFwd6q.png

接著使用 tw.app.com:32600就可以連接成功

https://ithelp.ithome.com.tw/upload/images/20231014/20162058D1PveWrrnz.png


上一篇
使用Docker Dektop或Minikube下載Kubernetes、安裝kubernetes-dashboard
下一篇
把Kubernetes整合到Jenkins pipeline中,完成CI/CD。與完賽心得
系列文
從0開始學習DevOps,並部署CICD至Java專案中30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言