已經有一段時間沒有更新一週精選了,前面更新了4期,主要很多問題大多數都是重複,都是一些反覆出現錯誤的問題,所以就沒有總結了。下面是最近微信羣裏面遇到的一些有代表的問題,希望對大家有所幫助。
1. Systemd 連接詞號“-”的作用
@傑森-伯恩 圈友提問,在 Docker 的啓動配置文件中有一個EnvironmentFile=-/run/flannel/docker的配置項,這裏的“-”的作用是什麼? 回答:這個是 Linux Systemd 的一個用法,在所有的啓動設置之前,都可以加上一個連詞號(-),表示"抑制錯誤",即發生錯誤的時候,不影響其他命令的執行。比如,EnvironmentFile=-/run/flannel/docker,就表示即使 /run/flannel/docker 這個文件不存在,也不會拋出錯誤,還可以繼續執行後面的動作。
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 繼續嘗試連接,無限循環。
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
6. Groovy 腳本問題
有同學寫 Jenkins Pipeline 腳本的時候發現插入的值沒有效果。這是因爲在 Groovy 腳本中支持單引號、雙號,但是雙引號才支持插值,單引號不支持;同樣的 Grovvy 也支持三引號,三引號又分爲三單引號和三雙引號,都支持換行,但是隻有三雙引號支持插值操作。
7. Fluentd 日誌收集問題
有同學在用 Fluentd 收集日誌的時候,不是很明白爲什麼是採集的 /var/log/containers 目錄下面的日誌,其實我們去觀察下這個目錄下面的日誌來源就可以明白,這個目錄下面的日誌實際上是來自於 Pod 目錄下面的日誌數據,而 Pod 下面的日誌數據又來自於 Docker 容器目錄下面的日誌數據的,所以我們需要將宿主機的 /var/log 目錄和 Fluentd 容器進行映射,而且如果更改了容器目錄,那麼 Fluentd 中的容器目錄也要保持一直纔行,這是因爲軟鏈接是宿主機的容器路徑。
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 指定的鏡像前綴去拉取鏡像了。
- 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 討論羣裏面共同學習。