1. 基础配置

  • 服务器开启硬件虚拟化支持;
  • 关闭SELinux和Firewalld服务;```

    sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/g’ /etc/sysconfig/selinux

    setenforce 0

    systemctl disable firewalld

    systemctl stop firewalld

    ```

  • 设置hostname并在/etc/hosts配置本地解析;```

    hostnamectl set-hostname master

vim /etc/hosts

x.x.x.x master …

  1. - 关闭Swap服务

swapoff -a

sed -i ‘/swap/d’ /etc/fstab


- 修改服务器配置参数(所有机器):```shell
# cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 10
EOF

# modprobe ip_conntrack
# modprobe br_netfilter
# cat /proc/sys/net/bridge/bridge-nf-call-iptables
1
# cat /proc/sys/net/bridge/bridge-nf-call-ip6tables
1

# sysctl -p /etc/sysctl.d/k8s.conf


kube-proxy开启ipvs的前置条件:```shell cat > /etc/sysconfig/modules/ipvs.modules <<EOF

!/bin/bash

modprobe — ip_vs modprobe — ip_vs_rr modprobe — ip_vs_wrr modprobe — ip_vs_sh modprobe — nf_conntrack_ipv4 EOF

chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

<br />打开文件数:```shell
echo "* soft nofile 65536" >> /etc/security/limits.conf
echo "* hard nofile 65536" >> /etc/security/limits.conf

2.Docker配置

  • 所有节点安装docker服务:```shell // 移除旧版本 yum -y remove docker-client docker-client-latest docker-common docker-latest docker-logrotate docker-latest-logrotate \ docker-selinux docker-engine-selinux docker-engine

// 安装依赖的软件 yum install -y yum-utils device-mapper-persistent-data lvm2 // 添加yum源 yum-config-manager —add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo // 更新并安装docker yum makecache fast yum -y install docker-ce

安装指定版本的Docker-CE:

Step 1: 查找Docker-CE的版本:

yum list docker-ce.x86_64 —showduplicates | sort -r

Step2 : 安装指定版本的Docker-CE: (VERSION 例如上面的 17.03.0.ce.1-1.el7.centos)

sudo yum -y install docker-ce-[VERSION]

注意:在某些版本之后,docker-ce安装出现了其他依赖包,如果安装失败的话请关注错误信息。例如 docker-ce 17.03 之后,需要先安装 docker-ce-selinux。

yum list docker-ce-selinux- —showduplicates | sort -r

sudo yum -y install docker-ce-selinux-[VERSION]


- 修改docker配置:```shell
# cat > /etc/docker/daemon.json << EOF
{
    "exec-opts": ["native.cgroupdriver=systemd"],
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "100m"
    },
    "storage-driver": "overlay2",
    "storage-opts": [
        "overlay2.override_kernel_check = true"
    ],
    "registry-mirrors": ["https://4p5gxeik.mirror.aliyuncs.com"]
}
EOF
  • 修改docker-service配置:```

    vim /usr/lib/systemd/system/docker.service

    原文:ExecStart=/usr/bin/dockerd -H fd:// —containerd=/run/containerd/containerd.sock 改为:ExecStart=/usr/bin/dockerd -H fd:// —containerd=/run/containerd/containerd.sock —exec-opt native.cgroupdriver=systemd `` <br />注:如果不修改,在添加worker节点时可能会报错:detected cgroupfs as ths Docker driver.xx`
  • 重启docker:```

    systemctl daemon-reload

    systemctl restart docker

    ```

3.所有节点安装k8s服务

  • 启动服务:systemctl enable kubelet && systemctl start kubelet

<br />


4. 节点部署

  • 如果需要初始化旧Master节点,执行 kubeadm reset

4.1 Master初始化

  • kubeadm init:
    可直接使用:kubeadm init
    也可以带配置参数:```

    kubeadm init \

    —apiserver-advertise-address 0.0.0.0 \ —apiserver-bind-port 6443 \ —control-plane-endpoint master1.lab.com \ —image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \ —kubernetes-version 1.18.2 \ —pod-network-cidr 10.11.0.0/16 \ —service-cidr 10.20.0.0/16 \ —service-dns-domain cluster.local \ ```

  • 使用配置文件init:```shell // 1.使用命令生成初始化文件

    kubeadm config print init-defaults > kubeadm-init.yml

    // 2.根据实际环境修改文件内容

    cat > kubeadm-init.yaml << EOF

    apiVersion: kubeadm.k8s.io/v1beta2 bootstrapTokens:

  • groups:
    • system:bootstrappers:kubeadm:default-node-token token: abcdef.0123456789abcdef ttl: 24h0m0s usages:
    • signing
    • authentication kind: InitConfiguration localAPIEndpoint: advertiseAddress: 172.17.19.209 # 本机IP bindPort: 6443 nodeRegistration: criSocket: /var/run/dockershim.sock name: master taints:
    • effect: NoSchedule key: node-role.kubernetes.io/master

apiServer: timeoutForControlPlane: 4m0s apiVersion: kubeadm.k8s.io/v1beta2 certificatesDir: /etc/kubernetes/pki clusterName: kubernetes controllerManager: {} dns: type: CoreDNS etcd: local: dataDir: /var/lib/etcd imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers # 国内镜像仓库 kind: ClusterConfiguration kubernetesVersion: v1.18.8 # 版本号 networking: dnsDomain: cluster.local serviceSubnet: 10.96.0.0/12 podSubnet: 10.244.0.0/16 # pod子网

scheduler: {}

apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration mode: ipvs EOF

kubeadm init —config INIT_FILE_PATH


- 参数说明:

—apiserver-advertise-address 0.0.0.0 \

API 服务器所公布的其正在监听的 IP 地址,指定“0.0.0.0”以使用默认网络接口的地址

切记只可以是内网IP,不能是外网IP,如果有多网卡,可以使用此选项指定某个网卡

—apiserver-bind-port 6443 \

API 服务器绑定的端口,默认 6443

—cert-dir /etc/kubernetes/pki \

保存和存储证书的路径,默认值:”/etc/kubernetes/pki”

—control-plane-endpoint kuber4s.api \

为控制平面指定一个稳定的 IP 地址或 DNS 名称,

这里指定的 kuber4s.api 已经在 /etc/hosts 配置解析为本机IP

—image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \

选择用于拉取Control-plane的镜像的容器仓库,默认值:”k8s.gcr.io”

因 Google被墙,这里选择国内仓库

—kubernetes-version 1.18.8 \

为Control-plane选择一个特定的 Kubernetes 版本, 默认值:”stable-1”

—node-name master01 \

指定节点的名称,不指定的话为主机hostname,默认可以不指定

—pod-network-cidr 10.244.0.1/16 \

指定pod的IP地址范围

—service-cidr 10.96.0.0/12 \

指定Service的VIP地址范围

—service-dns-domain cluster.local \

为Service另外指定域名,默认”cluster.local”

—upload-certs

将 Control-plane 证书上传到 kubeadm-certs Secret


- 配置kubectl(init成功后会有提示信息):

rm -f .kube && mkdir .kube

cp -i /etc/kubernets/admin.conf .kube/config

chown $(id -u):$(id -g) $HOME/.kube/config //可用于为普通用户分配kubectl权限



<a name="3df4a059"></a>
#### 4.2 安装网络插件

- flannel

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

kubectl apply -f kube-flannel.yml

<br />注:如果yml中的“Network”:"10.244.0.0/16"和kubeadm init xxx --pod-network-cidr不一样,就需要修改成一样的。不然可能会使得Node间Cluster IP不通。
- calico<br />确保Calico可以在主机上进行管理cali和tunl接口,如果主机上存在NetworkManage,NetworkManager(默认是停用的)会为默认网络名称空间中的接口操作路由表,固定了Calico veth对以连接到容器,可能干扰Calico代理正确路由的能力。

vim /etc/NetworkManager/conf.d/calico.conf

[keyfile] unmanaged-devices=interface-name:cali;interface-name:tunl

<br />默认为IPIP模式,开启BGP模式: `CALICO_IPV4POOL_IPIP -- Never````shell
# wget https://docs.projectcalico.org/manifests/calico.yaml

// 修改参数
# vim calico.yml
  // 修改网络,默认为192.168...
  - name: CALICO_IPV4POOL_CIDR
    value: "10.244.0.0/16"

  // 需要添加,指定接口,默认为first-found
  - name: IP_AUTODETECTION_METHOD
    value: "interface=eth.*"

# kubeclt apply calico.yaml

4.3 Node节点加入

加入节点(init成功后会有提示信息): kubeadm join 172.19.76.55:6443 --token

如果忘记了:kubeadm token create --print-join-command

4.4 kubectl自动补全

# yum -y install bash-completion
# source /usr/share/bash-completion/bash_completion
# source <(kubectl completion bash)
# echo "source <(kubectl completion bash)" >> /etc/bashrc