k8s集群详细安装部署

环境准备:一主一从,安装的 k8s 版本为 1.18.6

角色 地址 主机名
主节点master 192.168.10.51 node1
从节点 192.168.10.52 node2
### 以下操作在集群所有节点都执行,如未特殊说明均在root用户下进行
# 配置主机名映射
vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.10.51     node1
192.168.10.52     node2
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

# 关闭selinux
setenforce 0  # 临时
sed -i 's/enforcing/disabled/' /etc/selinux/config  # 永久

# 关闭swap
swapoff -a  # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab    # 永久

# 时间同步,保证都安装了ntp服务,先修改master时间,然后在slaves节点创建定时任务同步master时间
yum install ntpdate -y
# 主节点修改为当前时间
date -s "2022-11-03 9:53:00"
# 从节点
crontab -e
# 添加以下内容,注意修改ip为主节点ip,:wq保存退出
*/10 * * * * /usr/sbin/ntpdate 192.168.10.51;hwclock -w

# 配置docker国内镜像源,这里设置的是cgroupfs,测试过如果使用systemd会导致后续kube-dns服务异常
cat <<EOF > /etc/docker/daemon.json
{
    "registry-mirrors": [
        "http://hub-mirror.c.163.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://registry.docker-cn.com"
    ],
    "exec-opts": ["native.cgroupdriver=cgroupfs"]
}
EOF
# 重启docker服务使配置生效
systemctl restart docker

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

# 安装kubeadm、kubelet、kubectl,关闭gpgcheck检查
yum install -y kubelet-1.18.6 kubeadm-1.18.6 kubectl-1.18.6 --nogpgcheck
# init.default初始化文件,文件会生成在当前目录,可先切换指定目录再执行
kubeadm config print init-defaults >init.default.yaml

# 编辑init.default文件,在一台操作后可以执行scp远程拷贝到其它机器
vim init.default.yaml
# 找到以下内容,修改imageRepository,增加podSubnet,:wq保存退出
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.18.6
networking:
  podSubnet: "192.168.0.0/16"
  dnsDomain: cluster.local
 serviceSubnet: 10.96.0.0/12
scheduler: {}

# 下载Kubernetes的相关镜像
kubeadm config images pull --config=init.default.yaml

# 编辑文件
vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
# 在Environment="KUBELET_KUBECONFIG_ARGS这行后面的双引号前添加如下内容,注意空格分隔(这里设置的是cgroupfs与上述docker配置一致,测试过如果使用systemd会导致后续kube-dns服务异常)
--cgroup-driver=cgroupfs

# 执行以下命令启动Kubelet,并设置开机自启
systemctl daemon-reload
systemctl restart docker
systemctl enable docker
systemctl enable kubelet


### 以下操作仅在主节点执行
# 执行Kubeadm init命令初始化集群
kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.18.6 --pod-network-cidr=192.168.0.0/16

上一步的初始化过程中需要记住日志中的 token:

# 创建k8s用户,将配置文件复制到普通用户下
useradd k8s
passwd k8s
usermod -aG docker k8s
vim /etc/sudoers
k8s     ALL=(ALL)       ALL
su k8s
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
exit
# exit回root用户后配置到环境变量中
vim ~/.bashrc
# 在底部添加以下内容,保存退出
export KUBECONFIG=/etc/kubernetes/admin.conf
# 使环境变量生效
source ~/.bashrc

# 这个时候Master已经安装完毕,但是缺少NODE,并且没有容器网络功能,验证安装是否成功
kubectl get -n kube-system configmap


### 以下操作仅在从节点执行
# 加入Master,创建join-config.ymal文件
vim join-config.ymal
# 添加以下内容,apiServer为Master地址,token及tlsBootstrapToken为上面Master初始化后生成记录的token
apiVersion: kubeadm.k8s.io/v1beta2
kind: JoinConfiguration
discovery:
  bootstrapToken:
    apiServerEndpoint: 192.168.10.51:6443
    token: jl7w8g.jamjsy3bgvt58vdu
    unsafeSkipCAVerification: true
  tlsBootstrapToken: jl7w8g.jamjsy3bgvt58vdu
  
# wq保存退出后执行以下命令join集群
kubeadm join --config join-config.ymal

如果出现以下问题:
error execution phase kubelet-start: error uploading crisocket: timed out waiting for the condition
需要执行以下命令进行重新初始化操作,执行后重新执行上述 join 命令:

kubeadm reset
systemctl daemon-reload
systemctl restart kubelet
iptables -F
### 以下操作仅在主节点执行
# 查看node状态,此时可以看到节点都已经有了,但是都是NotReady状态,原因就是没有安装CNI网络插件
kubectl get nodes
# 安装CNI网络插件,选择calico插件
curl https://docs.projectcalico.org/v3.20/manifests/calico.yaml -O
# 默认calico.yaml中所使用的镜像都来源于docker.io国外镜像源,以下命令删除镜像docker.io前缀,使镜像从国内镜像加速站点下载
cat calico.yaml |grep 'image:'
sed -i 's#docker.io/##g' calico.yaml
cat calico.yaml |grep 'image:'
# 修改配置文件
vim calico.yaml
# 在文件中搜索CALICO_IPV4POOL_CIDR关键字,并取消注释,value要与kubeadm init命令中的pod-network-cidr值一致
            - name: CALICO_IPV4POOL_CIDR
              value: "192.168.0.0/16"
# 在文件中搜索CLUSTER_TYPE关键字,在其下方添加内容,value中的interface=后面注意修改为网卡名称,保存退出
            - name: CLUSTER_TYPE
              value: "k8s,bgp"
            # 自动检测此主机的 IPv4 地址的方法
            - name: IP_AUTODETECTION_METHOD
              value: "interface=eno1"
# 安装calico
kubectl apply -f calico.yaml

可能出现的问题:如果执行 kubectl get nodes 节点状态还是 NotReady:

# 查看pod状态,发现NAME为calico-node开头的状态为ImagePullBackOff
kubectl get pods -A
# 查看pod详细信息
kubectl describe pod <pod的NAME> -n <NAMESPACE>

查看发现日志显示:Error: ImagePullBackOff Failed to pull image "calico/cni:v3.20.6",证明cni:v3.20.6镜像下载失败,请确保已经执行了上述的 配置docker国内镜像源重启docker。如果已经配置,删除状态为 ImagePullBackOff 的 pod,请等待一段时间进行自动 init,并重新查看pod状态。

# 删除pod后查看状态
kubectl delete pod <pod的NAME> -n <NAMESPACE>
kubectl get pods -A

当镜像下载成功后状态如下:

posted @ 2022-11-08 17:31  Leil_blogs  阅读(1167)  评论(0编辑  收藏  举报