侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 748 篇文章
  • 累计创建 65 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

在 Kubernetes 中部署 Calico

zze
zze
2021-03-10 / 0 评论 / 1 点赞 / 1083 阅读 / 9811 字

不定期更新相关视频,抖音点击左上角加号后扫一扫右方侧边栏二维码关注我~正在更新《Shell其实很简单》系列

环境准备

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

IPRoleOS
10.0.1.111Master、NodeUbuntu 18.04
10.0.1.112Master、NodeUbuntu 18.04
10.0.1.113NodeUbuntu 18.04

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

关于 Ansible 方式快速构建 Kubernetes 集群可参考:https://github.com/zze326/ansible-deploy-kubernetes

修改主机清单 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 的基本组件后还会自动安装网络插件、CoreDNS、Dashboard 等附件,这里通过 --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:1.28.4
        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 集群中工作了。

参考官网:


在完成这篇文章之后,我已经对上述使用的 Ansible Role 进行了增强,以对 Calico 提供支持,所以你如果想要在 Kubernetes 集群中应用 Calico,直接使用我的 Ansible Role 就可以一键部署完成,直达链接:https://github.com/zze326/ansible-deploy-kubernetes

1

评论区