解决制作CI流水线时的no host异常报错

方法介绍

使用 HostAliases 向 Pod /etc/hosts 文件添加条目

当dns配置以及其他选项不合理时,可以通过向pod的/etc/hosts添加条目,可以在pod级别覆盖对主机名的解析,可以通过pod spec的pod aliases来自定义添加条目。

默认的hosts文件内容

当你启动一个nginx pod时,他会默认给你分配一个ip地址

bash 复制代码
kubectl exec nginx -- cat /etc/hosts

# Kubernetes-managed hosts file.
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
fe00::0	ip6-mcastprefix
fe00::1	ip6-allnodes
fe00::2	ip6-allrouters
10.200.0.4	nginx

但是如果你想让他解析到别的ip和域名可以通过添加HostAliases增加额外条目

例如 :要将 foo.localbar.local 解析为 127.0.0.1, 将 foo.remotebar.remote 解析为 10.1.2.3,你可以在 .spec.hostAliases 下为 Pod 配置 HostAliases。

bash 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: hostaliases-pod
spec:
  restartPolicy: Never
  hostAliases:
  - ip: "127.0.0.1"
    hostnames:
    - "foo.local"
    - "bar.local"
  - ip: "10.1.2.3"
    hostnames:
    - "foo.remote"
    - "bar.remote"
  containers:
  - name: cat-hosts
    image: busybox:1.28
    command:
    - cat
    args:
    - "/etc/hosts"

通过kubectl apply -f 启动pod查看hosts

bash 复制代码
# Kubernetes-managed hosts file.
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
fe00::0	ip6-mcastprefix
fe00::1	ip6-allnodes
fe00::2	ip6-allrouters
10.200.0.5	hostaliases-pod

# Entries added by HostAliases.
127.0.0.1	foo.local	bar.local
10.1.2.3	foo.remote	bar.remote

这样就增加了额外的条目!

为什么 kubelet 管理 hosts 文件?

kubelet 管理每个Pod 容器的 hosts 文件,以防止容器运行时在容器已经启动后修改文件。 由于历史原因,Kubernetes 总是使用 Docker Engine 作为其容器运行时,而 Docker Engine 将在容器启动后修改 /etc/hosts 文件。

按照上面的方法可以每次运行容器时,都符合你的预期

在CI流水线中添加podtemplate

下面是task的添加模板

bash 复制代码
apiVersion: tekton.dev/v1
kind: Task
metadata:
  name: mytask
spec:
  steps:
    - name: writesomething
      image: ubuntu
      command: ["bash", "-c"]
      args: ["echo 'foo' > /my-cache/bar"]
      volumeMounts:
        - name: my-cache
          mountPath: /my-cache
---
apiVersion: tekton.dev/v1
kind: Pipeline
metadata:
  name: mypipeline
spec:
  tasks:
    - name: task1
      taskRef:
        name: mytask
---
apiVersion: tekton.dev/v1
kind: PipelineRun
metadata:
  name: mypipelinerun
spec:
  pipelineRef:
    name: mypipeline
  taskRunTemplate:
    podTemplate:
      securityContext:
        runAsNonRoot: true
        runAsUser: 1001
      volumes:
        - name: my-cache
          persistentVolumeClaim:
            claimName: my-volume-claim
相关推荐
飘飘燃雪4 分钟前
Linux关于git上传大文件的解决方案:使用Git LFS
linux·git·lfs
烛.照1038 分钟前
Docker 安装MySQL
linux·mysql·docker·容器
CAE虚拟与现实13 分钟前
在 WSL2的 Ubuntu 20.04 中安装 Docker
linux·ubuntu·docker
Ares-Wang25 分钟前
kubernetes》》k8s》》Volume 数据卷 PVC PV NFS
云原生·容器·kubernetes
Auroral1561 小时前
Linux 命令参考手册
linux
飞鹰服务器1 小时前
服务器与电脑的区别
运维·服务器·电脑
和煦的春风1 小时前
Linux | 关于CPU 调频的一些QA
android·linux
开发小能手-roy2 小时前
ubuntu 服务器版本网络安全
服务器·web安全·ubuntu
在河之洲木水2 小时前
CFS 调度器两种调度类型普通调度 和 组调度
云原生·容器·kubernetes
dessler2 小时前
Kubernetes(k8s)-网络插件(Flannel)
linux·运维·kubernetes