环境准备

硬件准备

hostnameIP角色需求
k8s1192.168.2.161master - worker2C4G-100G
k8s2192.168.2.162master - worker2C4G-100G
k8s3192.168.2.163master - worker2C4G-100G
apiserver.demo192.168.2.164apiserver - nginx - 负载均衡2C4G-100G
  1. 3台master - worker 虚机为: 互为master、worker。
  2. apiserver主机名一定要修改,否则后面脚本会出错。
  3. CentOS 7.8 … 7.9 实测无误。
  4. 如有内核需求请升完内核再部署集群,否则集群部署完成后在升级内核集群会崩溃。

系统环境准备

1. 配置yum仓库,关闭firewalld、selinux、swap

另外一篇帖子介绍

2. 配置所有主机hosts

[root@k8s1 ~]# cat /etc/hosts 
192.168.2.161 k8s1 
192.168.2.162 k8s2 
192.168.2.163 k8s3 
192.168.2.164 apiserver.demo

3. 免密登陆

所有主机互相做免密登陆

ssh-keygen -t rsa -N '' -f /root/.ssh/id_rsa -q


ssh-copy-id root@192.168.2.161
ssh-copy-id root@192.168.2.162
ssh-copy-id root@192.168.2.163
ssh-copy-id root@192.168.2.164

4. NTP同步

#同步阿里云ntp时间服务器
ntpdate ntp1.aliyun.com



部署 k8s

初始化 apiserver

  • apiserver服务器执行
  • 部署nginx实现 负载均衡及反向代理
  • 此文为yum部署,也可源码部署。
#nginx 依赖
yum -y install gcc openssl pcre-devel
#nginx stream mod
yum -y install nginx nginx-mod-stream.x86_64
#开机自启nginx
systemctl enable nginx

#编辑nginx配置文件
vim /etc/nginx/nginx.conf

#在最后行添加
stream {
    server {
        listen 6443;
        proxy_pass k8s_masters;
    }
    upstream k8s_masters {
        server 192.168.2.161:6443;
        server 192.168.2.162:6443;
        server 192.168.2.163:6443;
        #sticky_cookie_insert srv_id expires=1h domain=apiservice.demo path=/;
    }
}

#重新启动nginx 以 加载配置
systemct restart nginx

安装 docker-ce-18.09 、kubernetes1.18

  • 通过脚本安装docker-ce、kubernetes1.18 或 手动执行
  • master、worker节点执行
vim install-k8s.sh

#!/bin/bash
# 卸载旧版本docker
yum remove -y docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine

# 设置 docker-ce  yum 仓库
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 安装并启动 docker
yum install -y docker-ce-18.09.7 docker-ce-cli-18.09.7 containerd.io
systemctl enable docker
systemctl start docker

# 安装 nfs-utils
yum install -y nfs-utils

# 修改 /etc/sysctl.conf
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf
# 执行命令以应用
sysctl -p

# 配置k8s的阿里云yum源
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=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
       http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

# 卸载旧版本
yum remove -y kubelet kubeadm kubectl

# 安装kubelet、kubeadm、kubectl
yum install -y kubelet-1.18.5 kubeadm-1.18.5 kubectl-1.18.5

# 修改docker Cgroup Driver为systemd
# # 将/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
# 如果不修改,在添加 worker 节点时可能会碰到如下错误
# [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". 
# Please follow the guide at https://kubernetes.io/docs/setup/cri/
sed -i "s#^ExecStart=/usr/bin/dockerd.*#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd#g" /usr/lib/systemd/system/docker.service

# 设置 docker 镜像,提高 docker 镜像下载速度和稳定性
# 如果您访问 https://hub.docker.io 速度非常稳定,亦可以跳过这个步骤
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

# 重启 docker,并启动 kubelet
systemctl daemon-reload
systemctl restart docker
systemctl enable kubelet && systemctl start kubelet

docker version
#赋予权限并执行脚本
chmod +x install-k8s.sh
./install-k8s.sh

初始化master节点

  • 只在第一个master节点执行,本文中的192.168.2.161
#创建脚本
vim initialize-master.sh

# 替换 apiserver.demo 为 您想要的 dnsName
export APISERVER_NAME=apiserver.demo
# Kubernetes 容器组所在的网段,该网段安装完成后,由 kubernetes 创建,事先并不存在于您的物理网络中
export POD_SUBNET=10.100.0.1/16
#下面用的apiserver反向代理来定义apiserver.demo,之前hosts已手动添加,此步可忽略或执行都无错。
echo "192.168.2.164    ${APISERVER_NAME}" >> /etc/hosts

#!/bin/bash
# 脚本出错时终止执行
set -e

if [ ${#POD_SUBNET} -eq 0 ] || [ ${#APISERVER_NAME} -eq 0 ]; then
  echo -e "\033[31;1m请确保您已经设置了环境变量 POD_SUBNET 和 APISERVER_NAME \033[0m"
  echo 当前POD_SUBNET=$POD_SUBNET
  echo 当前APISERVER_NAME=$APISERVER_NAME
  exit 1
fi


# 查看完整配置选项 https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2
rm -f ./kubeadm-config.yaml
cat <<EOF > ./kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.18.5
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
controlPlaneEndpoint: "${APISERVER_NAME}:6443"
networking:
  serviceSubnet: "10.96.0.0/16"
  podSubnet: "${POD_SUBNET}"
  dnsDomain: "cluster.local"
EOF

# kubeadm init
echo -e "\033[41;37m 根据您服务器网速的情况,您需要等候 3 - 10 分钟 \033[0m"
kubeadm init --config=kubeadm-config.yaml --upload-certs

# 配置 kubectl
rm -rf /root/.kube/
mkdir /root/.kube/
cp -i /etc/kubernetes/admin.conf /root/.kube/config

# 安装 calico 网络插件
rm -f calico-3.9.2.yaml
wget https://kuboard.cn/install-script/calico/calico-3.9.2.yaml
sed -i "s#192\.168\.0\.0/16#${POD_SUBNET}#" calico-3.9.2.yaml
kubectl apply -f calico-3.9.2.yaml
#赋予权限并执行脚本
chmod +x initialize-master.sh
./initialize-master.sh
  • 在执行完毕后的输出中提取kubeadm join 命令 (2小时内有效)
  • 检查节点初始化
    kubectl get node

加入集群

  • k8s2、k8s3节点执行此第一master输出的join命令加入k8s集群
#例如:
kubeadm join apiserver.demo:6443 --token iqo9pi.ajzg47smhqmzw81t   \
--discovery-token-ca-cert-hash sha256:54a722e5aacdb6cbe2da2cab490ef51031fbd49a403414a52449eb751645be13 \
--control-plane --certificate-key b557f4a9edab940c025dc81750125b5a260ef1df9320430d123ce9b9fe42db8a
  • 在第一master查看状态
    kubectl get pods -n kube-system
    kubectl get nodes
重新提取kubeadm join命令
  • 在第一master执行:
    kubeadm token create --print-join-command 获得sha256
    kubeadm init phase upload-certs --upload-certs 获得key
  • 添加--control-plane --certificate-key 已获得完整join命令

kubeadm join apiserver.demo:6443 --token iqo9pi.ajzg47smhqmzw81t \
–discovery-token-ca-cert-hash sha256:54a722e5aacdb6cbe2da2cab490ef51031fbd49a403414a52449eb751645be13 \
–control-plane --certificate-key b557f4a9edab940c025dc81750125b5a260ef1df9320430d123ce9b9fe42db8a

第二、三节点使用kubectl命令
  • 拷贝第一master admin.conf
    scp -r /etc/kubernetes/admin.conf root@k8s2:/etc/kubernetes/admin.conf
  • 刷新k8s2配置
echo export KUBECONFIG=/etc/kubernetes/admin.conf  >>  ~/.bash_profile
source ~/.bash_profile

#使用kubectl 命令
kubectl get nodes
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐