1.环境准备

1.1关闭selinux

getenforce # 查看
/usr/sbin/sestatus -v # 查看

vim /etc/selinux/config # 关闭selinux服务
将SELINUX=enforcing改为SELINUX=disabled

shutdown -r now 重启服务

1.2关闭防火墙

firewall-cmd --state # 查看防火墙状态
systemctl stop firewalld # 禁用防火墙
systemctl start firewalld # 启动防火墙

1.3关闭 swap

swapoff /mnt/swap    # 关闭swap分区

vim /etc/fstab   # 修改配置文件 - /etc/fstab
# /dev/mapper/centos-swap swap                    swap    defaults        0 0  注释这一条

free -h  # 确认swap已经关闭

vim /etc/sysctl.conf      sysctl -p      #  swappiness 参数  ,使配置生效
vm.swappiness=0     #  修改 vm.swappiness 的修改为 0   没有就添加

1.4每台主机的主机名不相同

hostnamectl   # 查看主机名
hostnamectl set-hostname localhost94   # hostnamectl修改主机名称  localhost94:主机名称

1.5每台主机的Mac 地址不相同

nmcli device show  # 查看 mac 地址

1.6每台主机的UUID 不相同

nmcli con show   # 查看网卡 uuid

1.7进行时间同步,并确认时间同步成功

timedatectl
timedatectl set-ntp true

2.安装docker

2.1卸载旧版本Docker

yum remove docker docker-common docker-selinux docker-engine

2.2安装依赖包

yum install -y yum-utils device-mapper-persistent-data lvm2

2.3添加 yum 软件源

yum-config-manager --add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo

2.4yum软件源缓存,并安装docker-ce

yum makecache fast && yum install -y docker-ce

2.5启动Docker守护进程

service docker start 
systemctl start docker   # centos7
systemctl enable docker   # 开机启动

3 安装 kubeadm、kubelet 和 kubectl

3.1.安装准备

需要在每台机器上安装以下的软件包:

  • kubeadm:用来初始化集群的指令。
  • kubelet:在集群中的每个节点上用来启动 pod 和容器等。
  • kubectl:用来与集群通信的命令行工具(Worker 节点可以不装,但是我装了,不影响什么)。

3.1配置K8S的yum源

# 这部分用是阿里云的源,如果可以访问Google,则建议用官方的源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

# 官方源配置如下
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

3.2增加配置

cat <<EOF > /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

3.3加载

sysctl --system

3.4安装

yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

3.5启动并设置 kubelet 开机启动

systemctl start kubelet
systemctl enable --now kubelet

4.使用 Kubeadm 创建集群

4.1初始化 Control-plane/Master 节点    master节点上执行

vim /etc/profile   source /etc/profile
export MASTER_IP=192.168.104.94
export APISERVER_NAME=kuber94s.api
# 设置hosts
echo "127.0.0.1 $(hostname)" >> /etc/hosts
echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts

4.2下面有不带注释的初始化命令,建议先查看带注释的每个参数对应的意义,确保与你的当前配置的环境是一致的,然后再执行初始化操作,避免踩雷。

# 初始化 Control-plane/Master 节点
kubeadm init \
    --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.17.3 \
    # 为Control-plane选择一个特定的 Kubernetes 版本, 默认值:"stable-1"
    --node-name master01 \
    #  指定节点的名称,不指定的话为主机hostname,默认可以不指定
    --pod-network-cidr 192.10.0.0/16 \
    # 指定pod的IP地址范围
    --service-cidr 192.20.0.0/16 \
    # 指定Service的VIP地址范围
    --service-dns-domain cluster.local \
    # 为Service另外指定域名,默认"cluster.local"
    --upload-certs
    # 将 Control-plane 证书上传到 kubeadm-certs Secret

4.3不带注释的内容如下,如果初始化超时,可以修改DNS为8.8.8.8后重启网络服务再次尝试。

kubeadm init \
 --apiserver-advertise-address 0.0.0.0 \
 --apiserver-bind-port 6443 \
 --cert-dir /etc/kubernetes/pki \
 --control-plane-endpoint kuber94s.api \
 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
 --kubernetes-version 1.20.5 \
 --pod-network-cidr 192.10.0.0/16 \
 --service-cidr 192.20.0.0/16 \
 --service-dns-domain cluster.local \
 --upload-certs

4.4如果初始化最终成功执行,你将看到如下信息:

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of the control-plane node running the following command on each as root:

  kubeadm join kuber94s.api:6443 --token bs9yxy.u1ubeptji5qv1m35 \
    --discovery-token-ca-cert-hash sha256:2f024af2be987cd1e22525d98aa47e3f8ad82fba0050fb59cfd1240f031905b6 \
    --control-plane --certificate-key d9be1be4f80152dfec64e790bffeac3262f5f954fd72a0265f8276ac5036bbea

Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join kuber94s.api:6443 --token bs9yxy.u1ubeptji5qv1m35 \
    --discovery-token-ca-cert-hash sha256:2f024af2be987cd1e22525d98aa47e3f8ad82fba0050fb59cfd1240f031905b6

4.5为普通用户添加 kubectl 运行权限,命令内容在初始化成功后的输出内容中可以看到。

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

4.6安装 Pod 网络附加组件 https://docs.projectcalico.org/manifests/calico.yaml

mkdir -p /usr/local/kubernetes/calico && cd /usr/local/kubernetes/calico
curl https://docs.projectcalico.org/manifests/calico.yaml -O
稍等片刻查询 pod 详情,你也可以使用 watch 命令来实时查看 pod 的状态,等待 Pod 网络组件部署成功后,就可以看到一些信息了,包括 Pod 的 IP 地址信息,这个过程时间可能会有点长。
watch -n 2 kubectl get pods --all-namespaces -o wide

4.7将 Worker 节点添加到 Kubernetes

vim /etc/profile   source /etc/profile
export MASTER_IP=192.168.104.94
export APISERVER_NAME=kuber94s.api
# 设置hosts
echo "127.0.0.1 $(hostname)" >> /etc/hosts
echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts

将 Worker 节点添加到集群,这里注意,执行后可能会报错,有幸的话你会跳进这个坑,这是因为 Worker 节点加入集群的命令实际上在初始化 master 时已经有提示出来了,不过两小时后会删除上传的证书,所以如果你此时加入集群的时候提示证书相关的错误,请执行 kubeadm init phase upload-certs –upload-certs 重新加载证书。

kubeadm token create --print-join-command  # 获取到结果  然后执行结果
kubeadm join kuber94s.api:6443 --token s7j2wg.6b7zu3lxv28q9gst     --discovery-token-ca-cert-hash sha256:2f024af2be987cd1e22525d98aa47e3f8ad82fba0050fb59cfd1240f031905b6 
kubeadm reset  # 如果报错就执行这个  在节点上先执行如下命令,清理kubeadm的操作,然后再重新执行join 命令:

4.8添加 Master 节点  添加多个master 做高可用   不做高可用  一个master就可以

kubeadm join kuber94s.api:6443 --token bs9yxy.u1ubeptji5qv1m35 \
    --discovery-token-ca-cert-hash sha256:2f024af2be987cd1e22525d98aa47e3f8ad82fba0050fb59cfd1240f031905b6 \
    --control-plane --certificate-key d9be1be4f80152dfec64e790bffeac3262f5f954fd72a0265f8276ac5036bbea
kubectl taint nodes --all node-role.kubernetes.io/master-  # 运行master上运行pod