這里開始我准備了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字段配置表來完成最好