kubernetes實踐之六十三:使用技巧

百聯達發表於2018-06-22
一:在容器中獲取 Pod 的IP

點選(此處)摺疊或開啟

  1. apiVersion: v1
  2. kind: ReplicationController
  3. metadata:
  4.   name: world-v2
  5. spec:
  6.   replicas: 3
  7.   selector:
  8.     app: world-v2
  9.   template:
  10.     metadata:
  11.       labels:
  12.         app: world-v2
  13.     spec:
  14.       containers:
  15.       - name: service
  16.         image: test
  17.         env:
  18.         - name: POD_IP
  19.           valueFrom:
  20.             fieldRef:
  21.               fieldPath: status.podIP
  22.         ports:
  23.         - name: service
  24.           containerPort: 777
容器中可以直接使用 POD_IP 環境變數獲取容器的 IP,透過環境變數來實現,該環境變數直接引用 resource 的狀態欄位。

二:在Pod中獲取宿主機的主機名、namespace等

點選(此處)摺疊或開啟

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: dapi-test-pod
  5. spec:
  6.   containers:
  7.     - name: test-container
  8.       image: busybox
  9.       command: [ "/bin/sh", "-c", "env" ]
  10.       env:
  11.         - name: MY_NODE_NAME
  12.           valueFrom:
  13.             fieldRef:
  14.               fieldPath: spec.nodeName
  15.         - name: MY_POD_NAME
  16.           valueFrom:
  17.             fieldRef:
  18.               fieldPath: metadata.name
  19.         - name: MY_POD_NAMESPACE
  20.           valueFrom:
  21.             fieldRef:
  22.               fieldPath: metadata.namespace
  23.         - name: MY_POD_IP
  24.           valueFrom:
  25.             fieldRef:
  26.               fieldPath: status.podIP
  27.         - name: HOST_IP
  28.           valueFrom:
  29.            fieldRef:
  30.              fieldPath: status.hostIP
  31.         - name: MY_POD_SERVICE_ACCOUNT
  32.           valueFrom:
  33.             fieldRef:
  34.               fieldPath: spec.serviceAccountName
  35.   restartPolicy: Never
這條技巧補充了第一條獲取 podIP 的內容,方法都是一樣的,只不過列出了更多的引用欄位。參考下面的 pod 定義,每個 pod 裡都有一個 {.spec.nodeName} 欄位,透過 fieldRef 和環境變數,就可以在Pod中獲取宿主機的主機名(訪問環境變數MY_NODE_NAME)。

三:指定容器的啟動引數

我們可以在 Pod 中為容器使用 command 為容器指定啟動引數:

點選(此處)摺疊或開啟

  1. command: ["/bin/bash","-c","bootstrap.sh"]
使用陣列的方式定義,所有命令使用跟 Dockerfile 中的 CMD 配置是一樣的,但是有一點不同的是,bootsttap.sh 必須具有可執行許可權,否則容器啟動時會出錯。

四:使容器內時間與宿主機同步

我們下載的很多容器內的時區都是格林尼治時間,與北京時間差8小時,這將導致容器內的日誌和檔案建立時間與實際時區不符,有兩種方式解決這個問題:
1.修改映象中的時區配置檔案
2.將宿主機的時區配置檔案/etc/localtime使用volume方式掛載到容器中
第二種方式比較簡單,不需要重做映象,只要在應用的yaml檔案中增加如下配置:

點選(此處)摺疊或開啟

  1. volumeMounts:
  2.   - name: host-time
  3.     mountPath: /etc/localtime
  4.     readOnly: true
  5.   volumes:
  6.   - name: host-time
  7.     hostPath:
  8.       path: /etc/localtime
五:kubectl 命令補全

點選(此處)摺疊或開啟

  1. # yum install -y bash-completion

  2. # source /usr/share/bash-completion/bash_completion

  3. # source <(kubectl completion bash)
六:建立一個CentOS測試容器

有時我們可能需要在Kubernetes叢集中建立一個容器來測試叢集的狀態或對其它容器進行操作,這時候我們需要一個操作節點,可以使用一個普通的CentOS容器來實現。即使用一個while迴圈保證容器啟動時擁有一個前臺程式。

點選(此處)摺疊或開啟

  1. apiVersion: extensions/v1beta1
  2. kind: Deployment
  3. metadata:
  4.   name: test
  5.   labels:
  6.     app: test
  7. spec:
  8.   replicas: 1
  9.   template:
  10.     metadata:
  11.       labels:
  12.         app: test
  13.     spec:
  14.       containers:
  15.       - image: harbor-001.jimmysong.io/library/centos:7.2.1511
  16.         name: test
  17.         command: ["/bin/bash","-c","while true; do sleep 1000; done"]
  18.         imagePullPolicy: IfNotPresent

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28624388/viewspace-2156486/,如需轉載,請註明出處,否則將追究法律責任。

相關文章