已经有一段时间没有更新一周精选了,前面更新了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 讨论群里面共同窗习。