.NetCore 使用k8s部署服務的過程中需要注意的地方以及遇到的問題


這里開始我准備了3台測試服務器,這里我使用了JumpServer管理起來了,這里我們來看下:

Master :192.168.0.236

Node1:192.168.0.237

Node2:192.168.0.238

 

 

這里k8s搭建的過程就略了,同時我們需要一個鏡像倉庫,這里安裝Harbor,安裝過程略

問題1:如何通過K8S 拉去我Harbor鏡像倉庫上的私有鏡像?

首先我們創建我們的k8s資源,這里提供了三種方式:

從文本輸入框創建、從文件創建、直接創建應用,要實現這一步需要去了解k8s yaml相關語法規則以及配置詳細,這里我貼下一個測試案例,這個配置是拷貝出來的,自己創建也不了這么多,這里需要特別了解就是

資源對象:Pod、ReplicaSet、ReplicationController、Deployment、StatefulSet、DaemonSet、Job、CronJob、HorizontalPodAutoscaling

配置對象:Node、Namespace、Service、Secret、ConfigMap、Ingress、Label、ThirdPartyResource、 ServiceAccount

存儲對象:Volume、Persistent Volume

策略對象:SecurityContext、ResourceQuota、LimitRange

這里創建一個Deployment為例子,這里就需要注意了,怎么來配置拉去鏡像呢?

#創建 deployment       這是我們要部署的項目
apiVersion: apps/v1
kind: Deployment
metadata:
  name: examimage-test             # 部署項目的名稱,必選
  namespace: uoso-system          # 項目部署在什么命名空間下
  labels:
    app: k8s-examimage               # 標簽,可以隨意定義,這個標簽在項目部署完成后還可以繼續修改
spec:
  replicas: 2                     # 生成副本數量為2
  selector:
    matchLabels:
      app: k8s-examimage
  template:
    metadata:
      labels:
        app: k8s-examimage
      annotations:
        app: examimage-clouster
    spec:
      containers:
      - name: examimage
        image: 私用倉庫地址/stu-exam/examimage:pro-1.0      # 鏡像的名字
        volumeMounts:
          - name: examimage-web                             # 卷名,隨意定義
            mountPath: /appexam/appsettings.json              # 容器內的目錄
            readOnly: true                               # 只讀
      volumes:
      - name: examimage-web                                 # 卷名,與上面一樣
        hostPath:                                        # 宿主機目錄,這里可以選擇網絡存儲等,下面注釋的地方是網絡存儲
        # nfs
          # server: ip地址
          path: /opt/testuoso/appsettings.json  # 掛載文件(文件夾)結束
        imagePullPolicy: IfNotPresent                    # 這里有三個值,這里的值表示的意思是"當鏡像不存在時就去倉庫拉取,存在時就直接使用"
      imagePullSecrets:
      - name: liyouming                      # 這里是當拉去鏡像時的密碼字典,這個要先定義好才能使用
        resources:
          limits:
            cpu: 300m
            memory: 3000Mi
          requests:
            cpu: 100m
            memory: 100Mi
        ports:
        - containerPort: 80                            # 這里的端口就是該鏡像暴露的端口,即Dockerfile文件里面EXPOSE的端口

 

 

 配置中添加了imagePullSecrets配置指定了保密字典配置名稱,那么我們怎么配置 registrysecret-uoso11賬戶的保密字典呢?

這里可能發現k8s並不像功能模塊一樣,一個模塊都有對應的添加,都是通過創建而來的,需要自定kind類型,前面也列舉了 對象類型了,創建保密字典我們需要創建Secret類型

 

 

 

這里我找一個看一下

 

 其中有些是系統生成的,我們實際創建的時候不需要這么多,我這邊整理下,這里需要注意的data 和type,type 共有三種方式對應不同的寫法,下面這個我們來創建下

kubernetes.io/dockerconfigjson 這個類型的,其他類型:kubernetes.io/service-account-token、Opaque

{
  "kind": "Secret",
  "apiVersion": "v1",
  "metadata": {
    "name": "liyouming",
    "namespace": "uoso-system"   
  },
  "data": {
    ".dockerconfigjson": "base64編碼的一個字符串docker密鑰" #這里又格式校驗的
  },
  "type": "kubernetes.io/dockerconfigjson"
}

dockerconfigjson 配置的內容怎么獲取呢?

就用master上的docker 遠程登錄下鏡像倉庫會生成:/root/.docker/config.json的文件,接下來我們來看下里面的內容,我們登錄docker harbor的賬戶授權都在這里了,我這個多了幾個

 

 這里我退出幾個就可以看到只剩下我遠程倉庫中的

 

 下面我們將 這個base64加密下,加加密后的編碼拷貝到.dockerconfigjson配置里面

 

 

 

 之前創建的 liyouming 就創建成功了,現在我們來拉去鏡像,接下來創建我們的部署,拷貝好之前寫好的yaml文件創建

 

 可以看到成功了 2個容器均應分布在了2個節點上,現在伸縮下 到6個,速度也是超快

 

 

到這里其實我們還是不能訪問的,還需要添加服務

apiVersion: v1
kind: Service
metadata:
  name: k8s-examimage                 # 定義該服務的名稱,可隨意填寫,但是最好是有意義的名字
  namespace: uoso-system           # 這里是指定該服務運行在什么命名空間下,如果不要這行的話,那么該服務會運行在default命名空間下,在k8s里面,不同命名空間下的所有應用都都是隔開的
  labels:                          # 設置該服務的標簽
    app: k8s-examimage               
spec:                             
  type: NodePort                   # 端口映射的方式
  ports:
  - port: 80                     # 端口
    targetPort: 80               # 分配Expose端口
    nodePort: 80                 # 外部端口
    protocol: TCP
#  clusterIP: 169.169.249.80     # 分配集群ip
  selector:
   app: k8s-examimage

創建服務后可以看到如下圖:

 現在看下我們之前的服務能不能訪問,我們分別訪問下 192.168.0.236、192.168.0.237、192.168.0.238,這里可以看到服務端口80

 

 

192.168.0.236 訪問正常

 

 

 

 

192.168.0.237 訪問正常

192.168.0.238 訪問也正常

其實這里還有一個問題的就是掛載資料卷的問題?

前面yaml中寫到的都是掛載到本機上的,但是多個節點不可能能每個節點都去寫對應的路徑配置文件,這是不科學的.

對於現有的采取措施,我自己的服務簡單的系統內部配置文件,打包的時候就直接打到容器內部不做修改,統一采用遠程配置中心(apollo)來出來配置修改

如果不需要熱更,其實打包到容器內部就ok了,其次如果有需要可以采用NFS來做文件處理或者使用 K8S字段配置表來完成最好


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM