iT邦幫忙

2022 iThome 鐵人賽

DAY 13
0
DevOps

前端轉生~到了實驗室就要養幾隻可愛鯨魚:自架 Kubernetes 迷航日記系列 第 13

Day 13 — 抓不完的走私貨櫃:練習架設服務 - Minecraft Server in Kubernetes

  • 分享至 

  • xImage
  •  

可愛鯨魚

殺死一個 container 還有千千萬萬個 container 等著~ (並沒有)

圖片來源:Docker (@Docker) / Twitter

上一篇簡單列出從 Docker 轉換到 Kubernetes 需要注意的項目 (Image, Volume, Network)
這篇先透過簡單的方案來練習一下 Kubernetes resource,之後的篇章會慢慢拆解各個部分,最後調整成適合的部署方案

架設服務

以下會根據不同 resource 分開描述

resource 完整檔案可以到 github ithome2022/mcs.yaml 查看

yaml 檔案使用 --- 分隔不同段,可以用來分隔多個 resource

# resource 1
apiVersion: v1
kind: Namespace
...
  
---
# resource 2
apiVersion: apps/v1
kind: Deployment
...

背景環境

這次練習的背景環境如下

  1. image: 使用社群提供的 image itzg/minecraft-server
  2. voluem: PersistentVolume 使用簡單的 hostPath 練習
  3. network: 對外的 Service 指定使用某一台機器的額外 ip (下方以 10.2.0.1 為例)
  4. 練習用 Day 11 補充的指令來轉換
    docker run -d -it --name mcs \
        -v /home/mcs:/data \
        -p 25565:25565 \
        --ip 10.2.0.1 \
        -e EULA="TRUE" \
        -e VERSION=1.19.2 \
        -e MEMORY=2G \
        -e TZ=Asia/Taipei \
        itzg/minecraft-server
    

Namespace

Namespace 可以將 resource 分群組,跟 cluster 內部權限設定 (ServiceAccount) 有關,基本上不能跨 Namespace 存取資源

先簡單建立 Namespace 讓 Minecraft Server 的資源都能放在一起

apiVersion: v1
kind: Namespace
metadata:
  name: mcs

Deployment

可以參考下圖架構,Deployment 透過宣告式 (Declaratively) 的方式向下管控 Pod,從 Deployment 可以透過宣告部署的版本、更版的部署策略自動化更版流程

deployment
圖片來源:[Kubernetes] Deployment Overview | 小信豬的原始部落

內容有點長,拆分一下...

  1. resource 基本設定

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      namespace: mcs
      name: mcs
    
  2. 部署相關設定

    spec:
      selector:
        matchLabels:
          app: mcs
      replicas: 1
      strategy:
        type: Recreate
      template:
        metadata:
          labels:
            app: mcs
        spec:
          ...
    
    • selector: 篩選要控制的 Pod,template 必須符合這項規則
    • replicas: 可以設定一次部署多個 Pod,這篇是使用 Minecraft Server 所以只設定 1 個
    • strategy: 設定更版的策略,可設定 RollingUpdateRecreate,在設定多個 replicas 才會有差別,RollingUpdate 會依序將 Pod 一個一個更新版本
    • template 設定部署的 Pod 模板
  3. spec > template > volumes,宣告使用 whale3 上的 /home/mcs 做為 hostPath volume

    spec:
      ...
      template:
        ...
        spec:
          nodeName: whale3
          volumes:
          - name: mcs-data
            hostPath:
              path: /home/mcs
    
  4. spce > template > containers 詳細設定

    spec:
      ...
      template:
        ...
        spec:
          containers:
          - name: mcs
            image: itzg/minecraft-server
            tty: true
    
    • volumeMounts 使用上一部宣告的 volume
            # volume
            volumeMounts:
            - name: mcs-data
              mountPath: /data
    
    • resources 限制 Pod 最大資源使用量,防止大量佔用資源
      (因為這個 image 有提供額外的功能,e.g. rcon,不能直接以 Minecraft Server 的設定值當作最大極限)
            # resource
            resources:
              requests:
                memory: "1Gi"
                cpu: "1000m"
              limits:
                memory: "2.5Gi2"
                cpu: "2500m"
    
    • ports 公開 port 25565
            # port
            ports:
            - containerPort: 25565
              name: mcs-port
    
    • Probe 用於測試健康度,這裡透過 image 提供的指令 mc-health 測試
            # probes
            startupProbe:    # 測試 initialze
              exec:
                command:
                  - mc-health
              initialDelaySeconds: 300
              timeoutSeconds: 1
              successThreshold: 1
              failureThreshold: 3
              periodSeconds: 10
            livenessProbe:    # 測試 Pod 健康度
              tcpSocket:
                port: 25565
              initialDelaySeconds: 10
              timeoutSeconds: 1
              successThreshold: 1
              failureThreshold: 3
              periodSeconds: 10
            readinessProbe:    # 測試服務健康度
              exec:
                command:
                  - mc-health
              initialDelaySeconds: 10
              timeoutSeconds: 1
              successThreshold: 1
              failureThreshold: 3
              periodSeconds: 10
    
    • env 設定環境參數
            # env
            env:
            - name: EULA
              value: "TRUE"
            - name: VERSION
              value: 1.19.2
            - name: MEMORY
              value: 2G
            - name: TZ
              value: Asia/Taipei
    

Service

Service 用來設定公開服務,這裡直接使用 external IP 指定

apiVersion: v1
kind: Service
metadata:
  namespace: mcs
  name: mcs
spec:
  selector:
    app: mcs
  ports:
  - name: mcs-port
    protocol: TCP
    port: 25565
    targetPort: mcs-port    # 對接 deployment template Port
  externalIPs:
  - 10.2.0.1

部署

kubectl apply -f mcs.yaml

logs...

測試連線

telnet 10.2.0.1 25565

成功~


Ref


今天練習利用基本的 Kubernetes resource 架起服務,只能稱得上堪用,面對不同的服務架設還需要更通盤的部署方法,接下來的篇章會針對部署的架構再進一步加強吧~ /images/emoticon/emoticon35.gif


上一篇
Day 12 — 艦隊通力合作搬運貨櫃:Docker 到 Kubernetes 轉換探討
下一篇
Day 14 — 有個私人的港口還好吧:私有儲存庫 Harbor (一)(使用 nodePort)
系列文
前端轉生~到了實驗室就要養幾隻可愛鯨魚:自架 Kubernetes 迷航日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言