Ansible部署二进制的k8s之calico网络插件

Calico部署完后pod状态显示CrashLoopBackOff如何处理?

地址://www.greatytc.com/p/87a01ec9964c

环境准备

如题,在开始之前我们需要一个干净 Kubernetes 集群,这里说的干净是指没有被网络插件干预过的集群。所以我这里准备如下三个节点:

IP           Role            OS
10.0.1.111   Master、Node    Ubuntu 18.04
10.0.1.112   Master、Node    Ubuntu 18.04
10.0.1.113   Node            Ubuntu 18.04

使用系统版本为 Ubuntu 18.04,这里就直接使用 Ansible Role 的方式来快速以二进制形式创建一个干净的 Kubernetes 集群

Ansible部署二进制的k8s

地址://www.greatytc.com/p/85edca636ddc

修改主机清单 hosts.yaml 配置内容如下:

all:
  vars:
    ansible_user: root
    ansible_ssh_pass: root1234
    ansible_sudo_pass: root1234
    is_mutil_master: yes
    virtual_ip: 10.0.1.110
    virtual_ip_device: ens33
    service_net: 10.0.0.0/24
    pod_net: 10.244.0.0/16
    proxy_master_port: 7443
    install_dir: /opt/apps/
    package_dir: /opt/packages/
    tls_dir: /opt/k8s_tls
    ntp_host: ntp1.aliyun.com
    have_network: yes
    replace_repo: yes
    docker_registry_mirrors: https://7hsct51i.mirror.aliyuncs.com
    kubelet_bootstrap_token: 8fba966b6e3b5d182960a30f6cb94428
    pause_image: registry.cn-shenzhen.aliyuncs.com/zze/pause:3.2
    dashboard_port: 30001
    dashboard_token_file: dashboard_token.txt
    ingress_controller_type: nginx
  hosts:
    10.0.1.111:
      hostname: k8s-master1
      master: yes
      node: yes
      etcd: yes
      proxy_master: yes
      proxy_priority: 110
    10.0.1.112:
      hostname: k8s-master2
      master: yes
      node: yes
      etcd: yes
      proxy_master: yes
      proxy_priority: 100
    10.0.1.113: 
      hostname: k8s-node1
      etcd: yes
      node: yes
      ingress: yes

通过如上配置可以构建一个由三节点组成的 2 Master + 3 Node 的 Kubernetes 集群,开始执行 Playbook:

$ ansible-playbook -i hosts.yml run.yml --skip-tag=deploy_manifests
...
TASK [start_service : 签发 Kubelet 申请的证书 - 签发证书 (2/2)] ***************************************************************************************************************************************************************************
skipping: [10.0.1.112]
skipping: [10.0.1.113]
changed: [10.0.1.111]

PLAY RECAP *********************************************************************************************************************************************************************************************************************
10.0.1.111                 : ok=88   changed=46   unreachable=0    failed=0    skipped=20   rescued=0    ignored=0   
10.0.1.112                 : ok=68   changed=32   unreachable=0    failed=0    skipped=15   rescued=0    ignored=0   
10.0.1.113                 : ok=48   changed=20   unreachable=0    failed=0    skipped=35   rescued=0    ignored=0 

Ansible 默认在部署完 Kubernetes 的基本组件后还会自动安装网络插件、CoreDNSDashboard 等附件,这里通过 --skip-tag=deploy-manifests 来忽略这些步骤

由于此 Ansible 默认是使用 Flannel 作为 cni 插件实现的,所以预装了一些 Flannel 二进制包,可以在各个节点中将其删除:

$ rm -f /opt/apps/cni/bin/*

至此,一个干净的 Kubernetes 集群就已经构建完成,可以看到它的各个节点如下:

$ kubectl get node 
NAME          STATUS     ROLES    AGE   VERSION
k8s-master1   NotReady   <none>   38m   v1.19.3
k8s-master2   NotReady   <none>   38m   v1.19.3
k8s-node1     NotReady   <none>   38m   v1.19.3

这里由于还没有安装网络插件,所以它处于 NotReady 状态,咱们继续下面的 Calico 部署步骤做完它们就会成为 Ready 状态了。

Calico 部署

从官网下载资源文件:

$ wget https://docs.projectcalico.org/manifests/calico-etcd.yaml

下面只列出修改的部分:

$ vim calico-etcd.yaml
...
# 这里反引号包裹的内容表示需要执行它将其结果替换到此处
  # etcd 证书私钥
  etcd-key: `cat /opt/k8s_tls/etcd/server-key.pem | base64 -w 0`
  # etcd 证书
  etcd-cert: `cat /opt/k8s_tls/etcd/server.pem | base64 -w 0`
  # etcd CA 证书
  etcd-ca: `cat /opt/k8s_tls/etcd/ca.pem | base64 -w 0`
...
  # etcd 集群地址
  etcd_endpoints: "https://10.0.1.111:2379,https://10.0.1.112:2379,https://10.0.1.113:2379"
  etcd_ca: "/calico-secrets/etcd-ca"
  etcd_cert: "/calico-secrets/etcd-cert"
  etcd_key: "/calico-secrets/etcd-key"
...
            # 禁止使用 IPIP 模式
            - name: CALICO_IPV4POOL_IPIP
              value: "Never"
            # 设置 Pod IP 地址段,此处 value 应该与之前配置的 hosts.yaml 中的 pod_net 变量值一致
            - name: CALICO_IPV4POOL_CIDR
              value: "10.244.0.0/16"
...
        # 修改 cni 插件二进制文件映射到宿主机的目录,此处 /opt/apps 与 hosts.yaml 中的 install_dir 变量值一致
        - name: cni-bin-dir
          hostPath:
            path: /opt/apps/cni/bin
        # 修改 cni 配置目录为手动指定的目录,此处 /opt/apps 与 hosts.yaml 中的 install_dir 变量值一致
        - name: cni-net-dir
          hostPath:
            path: /opt/apps/cni/conf
        # 修改 cni 日志目录为手动指定的目录,此处 /opt/apps 与 hosts.yaml 中的 install_dir 变量值一致
        - name: cni-log-dir
          hostPath:
            path: /opt/apps/cni/log
        # 修改此卷的挂载权限为 0440,有两处
        - name: etcd-certs
          secret:
            secretName: calico-etcd-secrets
            defaultMode: 0440

由于该资源文件使用的镜像源在国外,我将它们 download 下来后上传到了阿里云仓库,可以执行下面操作进行替换

$ sed -i 's#docker.io/calico/cni:v3.18.0#registry.cn-shenzhen.aliyuncs.com/zze/calico-cni:v3.18.0#g;s#docker.io/calico/pod2daemon-flexvol:v3.18.0#registry.cn-shenzhen.aliyuncs.com/zze/calico-pod2daemon-flexvol:v3.18.0#g;s#docker.io/calico/node:v3.18.0#registry.cn-shenzhen.aliyuncs.com/zze/calico-node:v3.18.0#g;s#docker.io/calico/kube-controllers:v3.18.0#registry.cn-shenzhen.aliyuncs.com/zze/calico-kube-controllers:v3.18.0#g' calico-etcd.yaml

注意:此时下载的 YAML 镜像版本为 v3.18.0

应用修改好的资源文件:

kubectl apply -f calico-etcd.yaml 
secret/calico-etcd-secrets created
configmap/calico-config created
clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrole.rbac.authorization.k8s.io/calico-node created
clusterrolebinding.rbac.authorization.k8s.io/calico-node created
daemonset.apps/calico-node created
serviceaccount/calico-node created
deployment.apps/calico-kube-controllers created
serviceaccount/calico-kube-controllers created
poddisruptionbudget.policy/calico-kube-controllers created

稍等片刻会在 kube-system 命名空间下启动如下 Pod:

$ kubectl get pod -n kube-system
NAME                                       READY   STATUS    RESTARTS   AGE   IP               NODE          NOMINATED NODE   READINESS GATES
calico-kube-controllers-79678fdb96-5w4kl   1/1     Running   0          16m   10.0.1.111       k8s-master1   <none>           <none>
calico-node-hsm8s                          1/1     Running   0          16m   10.0.1.112       k8s-master2   <none>           <none>
calico-node-qnm9r                          1/1     Running   0          16m   10.0.1.113       k8s-node1     <none>           <none>
calico-node-t4cjq                          1/1     Running   0          16m   10.0.1.111       k8s-master1   <none>           <none>

测试一下 Pod 的跨主机通信,应用如下资源文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: test
  name: test
spec:
  replicas: 3
  selector:
    matchLabels:
      app: test
  strategy: {}
  template:
    metadata:
      labels:
        app: test
    spec:
      containers:
      - image: busybox:latest
        command: ['sleep','3000']
        name: busybox

成功应用后将会创建如下三个 Pod:

$ kubectl get pod -o wide
NAME                   READY   STATUS    RESTARTS   AGE     IP           NODE          NOMINATED NODE   READINESS GATES
test-c4f594994-nl2ks   1/1     Running   0          2m49s   10.244.0.5   k8s-node1     <none>           <none>
test-c4f594994-s48pl   1/1     Running   0          2m49s   10.244.2.2   k8s-master1   <none>           <none>
test-c4f594994-wv6nj   1/1     Running   0          2m49s   10.244.1.2   k8s-master2   <none>           <none>

也可以在各 Node 上查看到由 Calico 管理的路由信息

随便进入一个 Pod 测试 ping 其它两个 Pod:

$ kubectl exec -it test-c4f594994-nl2ks -- sh
/ # ping 10.244.2.2
PING 10.244.2.2 (10.244.2.2): 56 data bytes
64 bytes from 10.244.2.2: seq=0 ttl=62 time=0.474 ms
^C
--- 10.244.2.2 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.474/0.474/0.474 ms
/ # ping 10.244.1.2
PING 10.244.1.2 (10.244.1.2): 56 data bytes
64 bytes from 10.244.1.2: seq=0 ttl=62 time=0.321 ms
^C
--- 10.244.1.2 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.321/0.321/0.321 ms

可以正常通信,说明 Calico 已经正常在 Kubernetes 集群中工作了。
参考官网:https://docs.projectcalico.org/getting-started/kubernetes/self-managed-onprem/onpremises

在完成这篇文章之后。我已经对上述使用的 Ansible Role 进行了增强,以对 Calico 提供支持,所以你如果想要在 Kubernetes 集群中应用 Calico,直接使用我的 Ansible Role 就可以一键部署完成。地址://www.greatytc.com/p/85edca636ddc

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容