k8s技術圈一週精選[第5期]

已經有一段時間沒有更新一週精選了,前面更新了4期,主要很多問題大多數都是重複,都是一些反覆出現錯誤的問題,所以就沒有總結了。下面是最近微信羣裏面遇到的一些有代表的問題,希望對大家有所幫助。

1. Systemd 連接詞號“-”的作用

@傑森-伯恩 圈友提問,在 Docker 的啓動配置文件中有一個EnvironmentFile=-/run/flannel/docker的配置項,這裏的“-”的作用是什麼? 回答:這個是 Linux Systemd 的一個用法,在所有的啓動設置之前,都可以加上一個連詞號(-),表示"抑制錯誤",即發生錯誤的時候,不影響其他命令的執行。比如,EnvironmentFile=-/run/flannel/docker,就表示即使 /run/flannel/docker 這個文件不存在,也不會拋出錯誤,還可以繼續執行後面的動作。
k8s技術圈一週精選[第5期]

2. 外網訪問 Kubernetes 集羣

我們的集羣搭建在雲服務下面的,但是有的時候需要在本地遠程連接集羣,這就需要我們通過 APIServer 的外網地址去訪問集羣了,但是我們在搭建集羣的時候肯定都是內網,也就是說外網 IP 沒有參與證書校驗,直接將 ~/.kube/config 下面的 apiserver 地址替換成外網 IP 肯定是會報證書錯誤的。

在安裝集羣的時候我們可以通過 kubeadm 的配置文件去指定參數 apiServerCertSANs,將外網 IP 也添加到裏面這樣就可以了。

但是如果是已經搭建好了的集羣,重新去生成下 apiserver 的證書到不是不可以,但是這樣重新生成一次畢竟有風險的,我們可以通過 openssl 工具去查看下 apiserver 證書的詳細信息:

$ openssl x509 -in apiserver.crt -noout -text
......
 X509v3 Subject Alternative Name:
                DNS:ydzs-master, DNS:kubernetes, DNS:kubernetes.default, DNS:kubernetes.default.svc, DNS:kubernetes.default.svc.cluster.local, IP Address:10.96.0.1, IP Address:10.151.30.11
......

我們可以看到裏面裏面參與證書前面的 hosts 地址包括了宿主機的 hostname,想到什麼了嗎?我們是不是就可以直接在本地 /etc/hosts 裏面做一個隱射 APIServer 的外網 IP -> ydzs-master,然後在本地的 ~/.kube/config 文件裏面將 apiserver 地址替換成 https://ydzs-master:6443 是不是就可以了圖片?這樣就解決了不用重新生成 apiserver 證書還可以在本地去訪問集羣的問題。這也是使用 kubeadm 搭建集羣的一些好處,當然如果你使用的是二進制方式搭建的話,最好在搭建之初就規劃下需要將哪些 hosts 用於簽名,後需要要更改的話還是略顯麻煩。

3. Jenkins Slave Pod 啓動錯誤

有一些同學在使用 Jenkins 配置動態 Slave Pod 的時候,遇到配置完成後啓動 Jenkins Slave Pod 的時候,連接不上,然後嘗試100次連接之後銷燬 Pod,然後會再創建一個 Slave Pod 繼續嘗試連接,無限循環。
k8s技術圈一週精選[第5期]

4. Gitlab CI Runner 域名解析問題

今天有同學在做 Gitlab CI 的時候遇到一個問題:gitlab 的域名不是通過外網的 DNS 解析的正常的域名,而是通過 /etc/hosts 添加的一個映射域名,這樣的話運行的 Gitlab CI Runner 的 Pod 就沒辦法解析 Git 地址了,就需要在 runner 的 Pod 中去添加 gitlab 域名對應的 hosts 了,那麼如何添加呢?

我們可以想到的是 Pod 的 hostAlias 可以實現這個需求,但是 runner 的 Pod 是自動生成的,沒辦法直接去定義 hostAlias。我們可以通過一個比較 hack 的方法,通過 --pre-clone-script 參數來指定一段腳本來添加 hosts 信息,也可以通過添加環境變量 RUNNER_PRE_CLONE_SCRIPT 來指定:

--pre-clone-script = "echo 'xx.xx.xxx.xx git.qikqiak.com' >> /etc/hosts"

5. Kubectl 高級使用

有的時候我們在使用 kubectl 工具來查看 Pod 列表的時候可能會覺得數據太多太雜亂無章了,其實我們可以使用 kubectl 工具來自定義需要顯示的數據。如下表示只展示 Pod 名稱 和 Node 名稱,並按照 Node 名稱進行排序:

kubectl get pods -o custom-columns=POD:metadata.name,NODE:spec.nodeName --sort-by spec.nodeName -n kube-system

k8s技術圈一週精選[第5期]

6. Groovy 腳本問題

有同學寫 Jenkins Pipeline 腳本的時候發現插入的值沒有效果。這是因爲在 Groovy 腳本中支持單引號、雙號,但是雙引號才支持插值,單引號不支持;同樣的 Grovvy 也支持三引號,三引號又分爲三單引號和三雙引號,都支持換行,但是隻有三雙引號支持插值操作。
k8s技術圈一週精選[第5期]
k8s技術圈一週精選[第5期]

7. Fluentd 日誌收集問題

有同學在用 Fluentd 收集日誌的時候,不是很明白爲什麼是採集的 /var/log/containers 目錄下面的日誌,其實我們去觀察下這個目錄下面的日誌來源就可以明白,這個目錄下面的日誌實際上是來自於 Pod 目錄下面的日誌數據,而 Pod 下面的日誌數據又來自於 Docker 容器目錄下面的日誌數據的,所以我們需要將宿主機的 /var/log 目錄和 Fluentd 容器進行映射,而且如果更改了容器目錄,那麼 Fluentd 中的容器目錄也要保持一直纔行,這是因爲軟鏈接是宿主機的容器路徑。
k8s技術圈一週精選[第5期]
k8s技術圈一週精選[第5期]

8. kubeadm 指定初始化集羣鏡像

在使用 kubeadm 搭建集羣的時候,默認情況下, 會從 k8s.gcr.io 倉庫拉取鏡像,但是 gcr 的鏡像默認又是被牆了的,所以我們安裝起來非常麻煩,當然我們可以去 docker hub 或者 阿里雲上面搜索對應的鏡像,pull 下來後重新打 tag,但是這樣確實也非常麻煩。

爲此我們可以通過一份配置文件來配置 kubeadm 的鏡像拉取策略,使用 imageRepository 來改變鏡像倉庫地址,如下面的 config.yaml 配置文件:

apiVersion: kubeadm.k8s.io/v1alpha1
kind: MasterConfiguration
api:
  advertiseAddress: "10.20.79.10"
networking:
  podSubnet: "10.244.0.0/16"
kubernetesVersion: "v1.10.3"
imageRepository: "registry.cn-hangzhou.aliyuncs.com/google_containers"

然後初始化的使用指定上面的配置文件即可:

kubeadm init --config kubeadm.yaml

這樣 kubeadm 就會使用 imageRepository 指定的鏡像前綴去拉取鏡像了。

  1. YAML 文件格式
    @魔怔求問configmap裏面的|和|-分別是啥意思呀

其實這個和configmap沒有太大的關係,這個是屬於YAML文件的語法格式:

多行字符串可以使用 | 保留換行符,也可以使用 > 摺疊換行,如:

this: |
  Foo
  Bar
that: >
  Foo
  Bar

對應的意思就是:{ this: 'Foo\nBar\n', that: 'Foo Bar\n' }

  • 表示保留文字塊末尾的換行,- 表示刪除字符串末尾的換行,如:
s1: |
  Foo

s2: |+
  Foo

s3: |-
  Foo

對應的意思就是:{ s1: 'Foo\n', s2: 'Foo\n\n\n', s3: 'Foo' }

往期精選內容:
k8s技術圈一週精選[第1期]
k8s技術圈一週精選[第2期]
k8s技術圈一週精選[第3期]
k8s技術圈一週精選[第4期]



掃描下面的二維碼(或微信搜索 k8s技術圈)關注我們的微信公衆帳號,在微信公衆帳號中回覆 加羣 即可加入到我們的 kubernetes 討論羣裏面共同學習。
k8s技術圈一週精選[第5期]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章