全站最帅😎
发布于 2020-05-22 / 1883 阅读
0
1

Kubernetes集群搭建

1. 环境准备

本次安装,使用 docker 18.09.9 和 kubelet-1.16.4,请确保centos版本在7.6及以上

# 查看centos版本命令
cat /etc/redhat-release

image.png

准备三台虚拟机,hostname分别命名为:master、work1、work2
如无特殊说明,操作都是针对所有节点

1.1 关闭防火墙

systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl status firewalld.service
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/g'   /etc/selinux/config
sed -i 's/^SELINUX=.*/SELINUX=disabled/g'   /etc/sysconfig/selinux
cat  /etc/selinux/config|grep SELINUX=

1.2 关闭交换内存

echo "vm.swappiness=0" >> /etc/sysctl.conf 
sysctl -p    #让配置生效
cat /proc/sys/vm/swappiness

1.3 配置 ip_forward 转发

# ip_forward配置文件当前内容为0,表示禁止数据包转,将其修改为1表示允许
echo "1" > /proc/sys/net/ipv4/ip_forward

1.4 配置相关yum源

  • 备份自身yum源
yum install -y wget
mkdir /etc/yum.repos.d/bak && mv /etc/yum.repos.d/CentOS-* /etc/yum.repos.d/bak/
  • 下载 centos7源、docker源、k8s源头
# 阿里云看这里
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 
wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/epel-7.repo 
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
cat > /etc/yum.repos.d/kubernetes.repo  <<EOF 
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
EOF

# 华为云看这里
wget -O /etc/yum.repos.d/CentOS-Base.repo https://repo.huaweicloud.com/repository/conf/CentOS-7-reg.repo
wget -O /etc/yum.repos.d/docker-ce.repo https://repo.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's+download.docker.com+repo.huaweicloud.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# !!!!!! 华为云的k8s开源库没有本次教程安装的k8s 1.16.4版本,所以我们还是用阿里云的k8s开源镜像库
# !!!!!! 华为云别整天吹牛逼了,跟阿里云的差距不是一点点,先把这些开源镜像的基础服务提升下质量再来吹牛逼
cat > /etc/yum.repos.d/kubernetes.repo  <<EOF 
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
EOF

1.5 刷新yum缓存

yum clean all && yum makecache fast

2. 安装docker

# 安装必要的系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 安装 Docker-CE
yum install docker-ce-18.09.9 docker-ce-cli-18.09.9 containerd.io -y
# 配置阿里云镜像加速器和k8s运行要求docker的--cgroup-driver=systemd
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["你的加速器地址,推荐阿里云"],
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
# 设置开机启动
systemctl enable docker && systemctl start docker

3. 安装 k8s 相关组件

yum install -y kubelet-1.16.4 kubeadm-1.16.4 kubectl-1.16.4
systemctl enable kubelet && systemctl start kubelet
# 添加 kubectl 上下文到环境中 
echo "source <(kubectl completion bash)" >> ~/.bash_profile 
source ~/.bash_profile

3.1 修改内核参数

k8s 网络一般使用 flannel,该网络需要设置内核参数 bridge-nf-call-iptables=1 添加参数配置文件:

sudo tee /etc/sysctl.d/k8s.conf <<-'EOF'
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
EOF

image.png

使参数生效

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

如果centos版本低于7.6这一步会出错,请按照如下步骤解决
执行 sysctl -p /etc/sysctl.d/k8s.conf 会报异常,一般是因为修改这个参数需要系统有 br_netfilter 模块
查看系统里是否有 br_netfilter 模块

lsmod |grep br_netfilter

image.png

新增 br_netfilter 模块:

到这里,所有节点的环境准备工作完毕。

4. master节点配置

4.1 master节点初始化操作

  • 执行初始化命令, --image-repository 指定阿里云的yum,因为默认的google官方源被墙。
kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.16.4 --pod-network-cidr=10.244.0.0/16
  • 如果在机器在内网中不允许访问公网,请事先将所需的镜像下载下来,通过 docker load 命令导入
# 获取当次安装所需的镜像列表信息
[root@kqkd1 ~]# kubeadm config images list
I0804 13:19:28.671072   15762 version.go:252] remote version is much newer: v1.21.3; falling back to: stable-1.19
W0804 13:19:29.456813   15762 configset.go:348] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
k8s.gcr.io/kube-apiserver:v1.19.13
k8s.gcr.io/kube-controller-manager:v1.19.13
k8s.gcr.io/kube-scheduler:v1.19.13
k8s.gcr.io/kube-proxy:v1.19.13
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.13-0
k8s.gcr.io/coredns:1.7.0

# 得到上面的镜像列表之后再通过如下方式下载
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.19.4
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.19.4
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.19.4
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.19.4
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.13-0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.7.0

# 打tag
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.19.13                 k8s.gcr.io/kube-apiserver:v1.19.13
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.19.13        k8s.gcr.io/kube-controller-manager:v1.19.13
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.19.13                 k8s.gcr.io/kube-scheduler:v1.19.13
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.19.13                     k8s.gcr.io/kube-proxy:v1.19.13
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2                               k8s.gcr.io/pause:3.2
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.13-0                           k8s.gcr.io/etcd:3.4.13-0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.7.0                           k8s.gcr.io/coredns:1.7.0

# 此时的初始化就不需要带上阿里云的镜像仓库地址了
kubeadm init --kubernetes-version v1.16.4 --pod-network-cidr=10.244.0.0/16

出现下面这幅图就代表初始化成功了,但是还需要按照说明执行以下命令:

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

image.png

4.2 添加 flannel 的网络

按照 master 的提示,我们接下来应该配置一个 pod network。 但是,因为国内网络不通的原因,此操作无法完成。 请使用博主为你定制的下面这个文件来完成。kqkd-flannel.yml下载

kubectl apply -f https://blog-20200224.oss-cn-shenzhen.aliyuncs.com/images/kqkd-flannel.yml

如果存在镜像下载失败,那么去 hub.docker.com 官方仓库搜索flannel,下载别人转存的镜像,然后重新打tag

image.png

至此,master节点初始化就已经完成了,最后在master上安装k8s命令补全

yum -y install bash-completion
source /etc/profile.d/bash_completion.sh
# 使用如下命令查看集群
kubectl get nodes

image.png

5. work 节点初始化

work节点的配置,相对master来说简单许多,只需要规划好节点的hostname即可
这里在 work1、work2上执行master初始化时打印的join语句

kubeadm join 192.168.3.180:6443 --token z3hvmn.e3wlgk6xnsam6brp \
    --discovery-token-ca-cert-hash sha256:d833e649a92f18715a88d2e11bca79425c76c03846eab297d9bf9d9de99c0a8d

image.png

image.png

如果不慎找不到当初的这条join token语句了,可以用以下几个命令找回来

# 获得token列表
kubeadm token list
# 重新创建一个token
kubeadm token create --print-join-command

可以看到work1、work2加入集群成功,回到master节点查看所有节点

kubectl get nodes

发现work1、work2已经成功加入

image.png

至此,整个集群的搭建过程就结束了。

6. 验证集群以及错误处理

执行下面的命令,验证Kubernetes集群的相关Pod是否都正常创建并运行:

kubectl get pods --all-namespaces

image.png

红色框所示服务是k8s内部pod,如果都是正常的那么表示k8s集群安装完成。

6.1 错误处理

如果发现有状态错误的Pod,则可以执行kubectl --namespace=kube-system describe pod <pod_name> 来查看错误原因,常见的错误原因是镜像没有下载完成。如果安装失败,则可以执行 kubeadm reset 命令将主机恢复原状,同时记得删除掉 $HOME/.kube 文件,执行以上步骤再次进行安装。经过博主在测试环境多次搭建尝试,一路走下来是完全没问题的,如果有中间过程出现问题的,请注意centos版本是否在7.6及以上,还可以通过网站左侧邮箱联系到博主寻求帮助。

6.2 剔除节点

# 在master节点执行
kubectl drain node名称 --delete-local-data --force --ignore-daemonsets
kubectl delete node node名称

# 在node上执行,删除对应的网络
kubeadm reset
ifconfig cni0 down
ip link delete cni0
ifconfig flannel.1 down
ip link delete flannel.1
rm -rf /var/lib/cni/

7. 后续优化

7.1 修改kubernetes服务 nodeport 类型的端口范围

如果不修改的话那么在 service 中可以在物理机暴露的端口范围是30000-32767

# master上执行
vim /etc/kubernetes/manifests/kube-apiserver.yaml

找到 --service-cluster-ip-range 这一行,在这一行的下一行增加 如下内容

- --service-node-port-range=1-65535

最后重启kubelet

systemctl daemon-reload
systemctl restart kubelet

image.png


评论