从零开始实现基于calico网络的k8s集群部署

以三个节点为例:
master 10.0.3.241
node01 10.0.3.242
node02 10.0.3.243

先决条件:修改三个节点的hosts

vi /etc/hosts
------
10.0.3.104 test.com # 私有镜像仓库的地址
10.0.3.241 master
10.0.3.242 node01
10.0.3.243 node02

一、K8s的安装

安装k8s,步骤如下;
(1)etcd/docker安装,忽略参考地址博客中的fannel部分 参考地址
(2)master组件安装参考地址
(3)node组件安装参考地址
Note:记得修改kubelet.config文件,参考地址
当实现了node加载后,即如下图,可继续完成对calico的安装。
在这里插入图片描述
小坑汇总:kubelet未成功启动;kubectl get csr得不到反馈,可能是token失效,可重新生成;别的坑,可参考我的博客,k8s笔记系列,基本能解锁所有的安装问题。。。。

二、calico的安装

calico组件:
整合ks8/calico一共有三个组件:
1.每个节点运行一个calico/node容器;包含了calico路由必须的bgp客户端
2.calico-cni网络插件的二进制文件(这是两个二进制可执行文件和配置文件的组合);直接与kubelet集成,运行在每节点从而发现被创建的容器,添加容器到calico网络
3.如果想要使用NetworkPolicy,需要安装Calico policy controller;实现了NetworkPolicy.

calico版本以3.2.6版本为基础,原则上现在的安装不能低于3.1,否则会出现各种问题,已踩过相关的坑。
当出现Kubernetes Calico node ‘XXXXXXXXXXX’ already using IPv4 Address XXXXXXXXX, CrashLoopBackOff错误时,可能是calico的版本过低,在此修改为3.1.1以上版本,以上为3.2.6版本。解决方案参考地址。

下载calicoctl工具

以下操作在三个节点上都需要实现

cd /usr/local/bin/
curl -O -L https://github.com/projectcalico/calicoctl/releases/download/v3.2.6/calicoctl
chmod +x calicoctl
scp calicoctl [email protected](243):/usr/local/bin/

# 下载calico、calico-ipam
wget -N -P /opt/cni/bin/ https://github.com/projectcalico/calico-cni/releases/download/v3.1.6/calico
wget -N -P /opt/cni/bin/ https://github.com/projectcalico/calico-cni/releases/download/v3.1.6/calico-ipam
chmod +x /opt/cni/bin/calico /opt/cni/bin/calico-ipam
下载安装文件

calico 安装官方指南:https://docs.projectcalico.org/v3.2/getting-started/kubernetes/installation/calico

# 下载rbac.yaml,不用修改可直接运行
wget https://docs.projectcalico.org/v3.2/getting-started/kubernetes/installation/rbac.yaml
kubectl apply -f rbac.yaml
wget https://docs.projectcalico.org/v3.2/getting-started/kubernetes/installation/hosted/calico.yaml
在node上拉取镜像,并tag为calico.yaml文件所需镜像。
# 拉取所需的docker镜像,
# quay.io/calico/ctl:v3.2.6
docker pull docker.io/calico/ctl:v3.2.6
docker tag docker.io/calico/ctl:v3.2.6 quay.io/calico/ctl:v3.2.6
# quay.io/calico/cni:v3.2.6
docker pull docker.io/calico/cni:v3.2.6
docker tag docker.io/calico/cni:v3.2.6 quay.io/calico/cni:v3.2.6
# quay.io/calico/kube-controllers:v3.2.6
docker pull docker.io/calico/kube-controllers:v3.2.6
docker tag docker.io/calico/kube-controllers:v3.2.6 quay.io/calico/kube-controllers:v3.2.6
# quay.io/calico/node:v3.2.6
docker pull docker.io/calico/node:v3.2.6
docker tag  docker.io/calico/node:v3.2.6  quay.io/calico/node:v3.2.6
在calico.yaml中修改
# calico_backend:Calico的后端,默认为bird。
# cni_network_config:符合CNI规范的网络配置,其中type=calico表示,Kubelet从 CNI_PATH(默认为/opt/cni/bin)找名为calico的可执行文件,用于容器IP地址的分配。
  #(1)修改etcd_endpoints:Configure this with the location of your etcd cluster。
  # Calico使用etcd来保存网络拓扑和状态,该参数指定etcd的地址,可以使用K8S Master所用的etcd,也可以另外搭建
  etcd_endpoints: "https://10.0.3.241:2379,https://10.0.3.242:2379,https://10.0.3.243:2379"

  # If you're using TLS enabled etcd uncomment the following.
  #(2) You must also populate the Secret below with these files.
  etcd_ca: "/calico-secrets/etcd-ca"
  etcd_cert: "/calico-secrets/etcd-cert"
  etcd_key: "/calico-secrets/etcd-key"
  # Configure the Calico backend to use.Calico的后端,默认为bird。
  calico_backend: "bird"
  # Configure the MTU to use
  veth_mtu: "1440" 
#(3)etcd如果配置了TLS安全认证,则还需要指定相应的ca、cert、key等文件,即修改TLS认证秘钥(此步骤与(4/5)两种方式二选一)
data:  
  etcd-ca: (cat /opt/etcd/ssl/ca.pem | base64 | tr -d '\n') #将输出结果填写在这里
  etcd-key: (cat /opt/etcd/ssl/server-key.pem | base64 | tr -d '\n') #将输出结果填写在这里
  etcd-cert: (cat opt/etcd/ssl/server.pem  | base64 | tr -d '\n') #将输出结果填写在这里
# (4)部署calico-node设置hostpath的方式来挂载TLS文件
        - name: etcd-certs
        # 添加hostPath
          hostPath:
            path: /etc/calico/calicoTLS
          # 该文件可在/calico-secrets.bak/文件中搜索到
          # 注释掉一下secret
          #secret:
            #secretName: calico-etcd-secrets
            #defaultMode: 0400
        
# (5)部署calico-kube-controllers设置hostpath挂载TLS文件
        - name: etcd-certs
        # 添加hostPath
          hostPath:
            path: v
          # 注释掉一下secret
          #secret:
            #secretName: calico-etcd-secrets
            #defaultMode: 0400

# (6)必须要修改,根据实际需求,与集群内部ip range保持一致
      - name: CALICO_IPV4POOL_CIDR
        value: "10.0.0.0/24"

从零开始实现基于calico网络的k8s集群部署_第1张图片

注:
a) calico.yaml修改

(6)的修改,可参见官方文档解释及ipPool设置标准,这里将一部分重点进行转译。
例如,在Kubernetes中,以下所有三个参数必须等于或包含Calico IP池CIDR(为保证万无一失,最好设置等于):

  • kube-apiserver: --pod-network-cidr (vi /opt/kubernetes/cfg/kube-apiserver,我的是–service-cluster-ip-range=10.0.0.0/24 )
  • kube-proxy: --cluster-cidr (vi /opt/kubernetes/cfg/kube-proxy,我的是–cluster-cidr=10.0.0.0/24)
  • kube-controller-manager: --cluster-cidr (vi /opt/kubernetes/cfg/kube-controller-manager,我的是–service-cluster-ip-range=10.0.0.0/24 )
  • “- name: CALICO_IPV4POOL_CIDR”。要求,cluster-cidr尽量大一些,才能使用到尽可能多的wordload。
  • 部署建议,全部设为172.16.0.0/16,基本满足现有需求。

(7)master节点配置时,除相关配置文件不可少之外,要关注在master节点,calico/node是否跑起来

docker pull calico/node:v3.2.6
calicoctl node run --node-image=calico/node:v3.2.6
a) 如何管理ippool
# 获取当前的ippool
calicoctl get ippool -o wide

# 查看当前ippool获取的pod ip情况
calicoctl get wep --all-namespaces

# 备份当前的ippool
calicoctl get ippool -o yaml > pool_bak.yaml

# 添加新的ippool,并应用
calicoctl apply -f new-pool.yaml
#---------------------
calicoctl create -f -<apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: new-pool
spec:
# 修改cidr,当前的ippool范围设置
  cidr: 10.0.0.0/24
  #  ipipMode模式选择always、cross-subnet
  ipipMode: Always
  natOutgoing: true
  # disabled: false 默认是false,如何为true,则表示关闭改ippool
EOF
#----------------------

# 修改生成的pool_bak.yaml,将待删除的ippool添加disabled: false,进行关闭
# 并进行apply应用
calicoctl apply -f pool.yaml

# 删除ippool
calicoctl delete pool default-ipv4-ippool
# 或者删除ip
calicoctl delete pool 10.1.1.0/24

相关配置解释:

在calico.yaml文件中,配置DaemonSet的calico-node服务。
该POD中主要包括如下两个容器:

  • calico-node:calico服务程序,用于设置Pod的网络资源,保证pod的网络与各Node互联互通,它还需要以HostNetwork模式运行,直接使用宿主机网络。
  • install-cni:在各Node上安装CNI二进制文件到/opt/cni/bin目录下,并安装相应的网络配置文件到/etc/cni/net.d目录下。

calico-node服务的主要参数:

  • CALICO_IPV4POOL_CIDR: Calico IPAM的IP地址池,Pod的IP地址将从该池中进行分配。

  • CALICO_IPV4POOL_IPIP:是否启用IPIP模式,启用IPIP模式时,Calico将在node上创建一个tunl0的虚拟隧道。

  • FELIX_LOGSEVERITYSCREEN: 日志级别。

  • FELIX_IPV6SUPPORT : 是否启用IPV6。

  • IP Pool可以使用两种模式:BGP或IPIP。
    (1)使用IPIP模式时,设置 CALICO_IPV4POOL_IPIP=“always”,不使用IPIP模式时,设置为"off",此时将使用BGP模式。

      BGP模式下,不会在服务器上创建tun10
      路由转发功能是通过服务器的物理机网卡作为路由器对流量进行转发的
      路由即纯bgp模式,理论上ipip模式的网络传输性能低于纯bgp模式
    

(2)IPIP是一种将各Node的路由之间做一个tunnel,再把两个网络连接起来的模式,启用IPIP模式时,Calico将在各Node上创建一个名为"tunl0"的虚拟网络接口。

一种妥协的overlay机制,在宿主机创建1个”tunl0”虚拟端口
通过tun10作为路由转发
分为两种模式:
	ipip always模式(纯ipip模式)
	ipip cross-subnet模式(ipip-bgp混合模式):
		指“同子网内路由采用bgp,跨子网路由采用ipip”
  • 部署calico-node设置hostpath的方式来挂载TLS文件
修改kubelet、kube-proxy启动文件

修改kubelet文件

# vi /opt/kubernetes/cfg/kubelet

KUBELET_OPTS="--logtostderr=true \
--v=4 \
--address=10.0.3.242 \
--hostname-override=10.0.3.242 \
# 添加以下四项
# ---------------
--allow-privileged=true \
--network-plugin=cni \
--cni-conf-dir=/etc/cni/net.d \
--cni-bin-dir=/opt/cni/bin \
# ---------------
--kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig \
--experimental-bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig \
--config=/opt/kubernetes/cfg/kubelet.config \
--cert-dir=/opt/kubernetes/ssl \
--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0"

修改kube-proxy文件

vi /opt/kubernetes/cfg/kube-proxy

KUBE_PROXY_OPTS="--logtostderr=true \
--v=4 \
--hostname-override=10.0.3.242 \
--cluster-cidr=10.0.0.0/24 \
--proxy-mode=iptables \ # 修改ipvs为iptables
--kubeconfig=/opt/kubernetes/cfg/kube-proxy.kubeconfig"

重新启动kubelet、kube-proxy

systemctl restart kubelet
systemctl restart kube-proxy
配置calicoctl启动

(1)calico环境文件

# vi /etc/calico/calico.env
ETCD_ENDPOINTS=https://10.0.3.241:2379,https://10.0.3.242:2379,https://10.0.3.243:2379  #每个节点上修改此处
ETCD_CA_FILE=""
ETCD_CERT_FILE=""
ETCD_KEY_FILE=""
CALICO_NODENAME=""
CALICO_NO_DEFAULT_POOLS=""
#CALICO_IP=""
CALICO_IP=""
CALICO_IP6=""
CALICO_AS=""
CALICO_LIBNETWORK_ENABLED=true
CALICO_NETWORKING_BACKEND=bird

(2)calicoctl配置文件,每个节点上都相同

# vi /etc/calico/calicoctl.cfg
apiVersion: projectcalico.org/v3
kind: CalicoAPIConfig
metadata:
spec:
  datastoreType: "etcdv3"
  etcdEndpoints: "https://10.0.3.241:2379,https://10.0.3.242:2379,https://10.0.3.243:2379"
  etcdKeyFile: /opt/etcd/ssl/server-key.pem
  etcdCertFile: /opt/etcd/ssl/server.pem
  etcdCACertFile: /opt/etcd/ssl/ca.pem
systemctl start calico-node
systemctl enable calico-node

在各个node节点上查看calico的运行情况,如在node01:242上

calicoctl node status

从零开始实现基于calico网络的k8s集群部署_第2张图片
在master上查看可互通的节点

calicoctl get nodes

从零开始实现基于calico网络的k8s集群部署_第3张图片

参考:
(1)https://blog.51cto.com/newfly/2062210
(2)https://docs.projectcalico.org/v3.2/getting-started/kubernetes/installation/calico
(3)当出现Kubernetes Calico node ‘XXXXXXXXXXX’ already using IPv4 Address XXXXXXXXX, CrashLoopBackOff错误时,可能是calico的版本过低,在此修改为3.1.1以上版本,以上为3.2.6版本。
参考 https://stackoverflow.com/questions/52390481/kubernetes-calico-node-xxxxxxxxxxx-already-using-ipv4-address-xxxxxxxxx-crash

你可能感兴趣的:(k8s搭建,平台搭建)