已經有一段時間沒有更新一週精選了,前面更新了4期,主要不少問題大多數都是重複,都是一些反覆出現錯誤的問題,因此就沒有總結了。下面是最近微信羣裏面遇到的一些有表明的問題,但願對你們有所幫助。node
@傑森-伯恩 圈友提問,在 Docker 的啓動配置文件中有一個EnvironmentFile=-/run/flannel/docker的配置項,這裏的「-」的做用是什麼? 回答:這個是 Linux Systemd 的一個用法,在全部的啓動設置以前,均可以加上一個連詞號(-),表示"抑制錯誤",即發生錯誤的時候,不影響其餘命令的執行。好比,EnvironmentFile=-/run/flannel/docker,就表示即便 /run/flannel/docker 這個文件不存在,也不會拋出錯誤,還能夠繼續執行後面的動做。git
咱們的集羣搭建在雲服務下面的,可是有的時候須要在本地遠程鏈接集羣,這就須要咱們經過 APIServer 的外網地址去訪問集羣了,可是咱們在搭建集羣的時候確定都是內網,也就是說外網 IP 沒有參與證書校驗,直接將 ~/.kube/config 下面的 apiserver 地址替換成外網 IP 確定是會報證書錯誤的。docker
在安裝集羣的時候咱們能夠經過 kubeadm 的配置文件去指定參數 apiServerCertSANs,將外網 IP 也添加到裏面這樣就能夠了。api
可是若是是已經搭建好了的集羣,從新去生成下 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 用於簽名,後須要要更改的話仍是略顯麻煩。ide
有一些同窗在使用 Jenkins 配置動態 Slave Pod 的時候,遇到配置完成後啓動 Jenkins Slave Pod 的時候,鏈接不上,而後嘗試100次鏈接以後銷燬 Pod,而後會再建立一個 Slave Pod 繼續嘗試鏈接,無限循環。工具
今天有同窗在作 Gitlab CI 的時候遇到一個問題:gitlab 的域名不是經過外網的 DNS 解析的正常的域名,而是經過 /etc/hosts 添加的一個映射域名,這樣的話運行的 Gitlab CI Runner 的 Pod 就沒辦法解析 Git 地址了,就須要在 runner 的 Pod 中去添加 gitlab 域名對應的 hosts 了,那麼如何添加呢?gitlab
咱們能夠想到的是 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"
有的時候咱們在使用 kubectl 工具來查看 Pod 列表的時候可能會以爲數據太多太雜亂無章了,其實咱們可使用 kubectl 工具來自定義須要顯示的數據。以下表示只展現 Pod 名稱 和 Node 名稱,並按照 Node 名稱進行排序:this
kubectl get pods -o custom-columns=POD:metadata.name,NODE:spec.nodeName --sort-by spec.nodeName -n kube-system
有同窗寫 Jenkins Pipeline 腳本的時候發現插入的值沒有效果。這是由於在 Groovy 腳本中支持單引號、雙號,可是雙引號才支持插值,單引號不支持;一樣的 Grovvy 也支持三引號,三引號又分爲三單引號和三雙引號,都支持換行,可是隻有三雙引號支持插值操做。
有同窗在用 Fluentd 收集日誌的時候,不是很明白爲何是採集的 /var/log/containers 目錄下面的日誌,其實咱們去觀察下這個目錄下面的日誌來源就能夠明白,這個目錄下面的日誌其實是來自於 Pod 目錄下面的日誌數據,而 Pod 下面的日誌數據又來自於 Docker 容器目錄下面的日誌數據的,因此咱們須要將宿主機的 /var/log 目錄和 Fluentd 容器進行映射,並且若是更改了容器目錄,那麼 Fluentd 中的容器目錄也要保持一直才行,這是由於軟連接是宿主機的容器路徑。
在使用 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 指定的鏡像前綴去拉取鏡像了。
其實這個和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 討論羣裏面共同窗習。