centos7搭建k8s集群(v1.19.x)
一、部署环境
共有3台服务器 1台master,2台node。
二、安装准备工作
1 关闭防火墙以及
systemctl stop firewalld && systemctl disable firewalld
2 永久关闭selinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config;cat /etc/selinux/config
3修改主机名, 三个机器对应分别执行
hostnamectl set-hostname master
hostnamectl set-hostname node01
hostnamectl set-hostname node02
退出重新登陆即可显示新设置的主机名master
4修改hosts文件
cat >> /etc/hosts << EOF
192.168.214.128 master
192.168.214.129 node01
192.168.214.130 node02
EOF
5禁用swap
swapoff -a
sed -i.bak '/swap/s/^/#/' /etc/fstab
6内核参数修改
#flannel网络需要设置内核参数bridge-nf-call-iptables=1
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
立即生效:
sysctl -p /etc/sysctl.d/k8s.conf
7新增kubernetes源
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
##########################
[] 中括号中的是repository id,唯一,用来标识不同仓库
name 仓库名称,自定义
baseurl 仓库地址
enable 是否启用该仓库,默认为1表示启用
gpgcheck 是否验证从该仓库获得程序包的合法性,1为验证
repo_gpgcheck 是否验证元数据的合法性 元数据就是程序包列表,1为验证
gpgkey=URL 数字签名的公钥文件所在位置,如果gpgcheck值为1,此处就需要指定gpgkey文件的位置,如果gpgcheck值为0就不需要此项了
8更新缓存
yum clean all
yum -y makecache
9. 安装命令补全
9.1 安装bash-completion
yum -y install bash-completion
9.2 加载bash-completion
source /etc/profile.d/bash_completion.sh
三、Docker安装(已安装可跳过)
master node节点都执行本部分操作。
1. 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
2. 设置Docker源
#推荐使用国内的
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3. 安装Docker CE
3.1 docker可安装版本查看
yum list docker-ce --showduplicates | sort -r
3.2 安装docker
yum install docker-ce-19.03.13 docker-ce-cli-19.03.13 containerd.io -y
4. 启动Docker并开机自启
systemctl start docker
systemctl enable docker
5. 配置镜像加速
由于Docker Hub的服务器在国外,下载镜像会比较慢,可以配置镜像加速器
5.1 配置daemon.json文件:
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://23h04een.mirror.aliyuncs.com"]
}
EOF
5.2 重启服务
systemctl daemon-reload
systemctl restart docker
6. 修改Cgroup Driver
6.1 修改daemon.json 新增‘”exec-opts”: [“native.cgroupdriver=systemd”’
修改cgroupdriver是为了消除告警:
[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/
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://23h04een.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
6.2 重启docker
systemctl daemon-reload
systemctl restart docker
四、k8s安装
master node节点都执行本部分操作。
1. 可安装版本查看
yum list kubelet --showduplicates | sort -r
2. 安装kubelet、kubeadm和kubectl
2.1 安装
yum install -y kubelet-1.19.2 kubeadm-1.19.2 kubectl-1.19.2
#kubelet 运行在集群所有节点上,用于启动Pod和容器等对象的工具
#kubeadm 用于初始化集群,启动集群的命令工具
#kubectl 用于和集群通信的命令行,通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
2.2 启动kubelet并设置开机启动
systemctl enable kubelet && systemctl start kubelet
2.3 kubectl命令补全
echo "source <(kubectl completion bash)" >> ~/.bash_profile
source .bash_profile
3. 下载镜像
3.1 镜像下载的脚本
Kubernetes几乎所有的安装组件和Docker镜像都放在goolge自己的网站上,直接访问可能会有网络问题
解决办法:
是从阿里云镜像仓库下载镜像,拉取到本地以后改回默认的镜像tag。使用如下脚本实现。
vim image.sh
#!/bin/bash
url=registry.aliyuncs.com/google_containers
version=v1.19.2
images=(`kubeadm config images list --kubernetes-version=$version|awk -F '/' '{print $2}'`)
for imagename in ${images[@]} ; do
docker pull $url/$imagename
docker tag $url/$imagename k8s.gcr.io/$imagename
docker rmi -f $url/$imagename
done
#url为阿里云镜像仓库地址,version为安装的kubernetes版本。
3.2 运行脚本image.sh下载镜像,可手动修改“version=v1.19.2”以下载指定版本的镜像
sh image.sh
# 注意 :每个节点都要执行,否则部分k8s必要的容器创建不成功
五、初始化Master
master节点执行本部分操作。
1. master初始化
kubeadm init --apiserver-advertise-address=192.168.214.128 --kubernetes-version v1.19.2 --service-cidr=10.96.0.0/12 --pod-netnode-cidr=10.244.0.0/16
#如果初始化失败,可执行kubeadm reset后重新初始化
kubeadm reset
rm -rf $HOME/.kube/config
2. 加载环境变量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source .bash_profile
3. 安装flannel网络
3.1 配置host
因为国内网络无法解析raw.githubusercontent.com,因此先访问https://tool.chinaz.com/dns/?type=1&host=raw.githubusercontent.com&ip=
查看raw.githubusercontent.com的真实IP,并对应修改host
cat >> /etc/hosts << EOF
151.101.108.133 raw.githubusercontent.com
EOF
3.2 在master上创建建flannel网络
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml
3.3 查看flannel状态
flannel创建容易出错导致容器无法运行,下图为成功状态
若状态不为running,可使用 kubectl describe pod xx -n kube-system 查看原因
六、node节点加入集群
1. node加入集群
kubeadm join 192.168.214.128:6443 --token 4xpmwx.nw6psmvn9qi4d3cj \
--discovery-token-ca-cert-hash sha256:c7cbe95a66092c58...
2. 集群节点查看
kubectl get nodes
七、Dashboard搭建
Dashboard提供了可以实现集群管理、工作负载、服务发现和负载均衡、存储、字典配置、日志视图等功能。
1. 下载yaml
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml
2. 配置yaml
2.1 修改镜像地址
sed -i 's/kubernetesui/registry.cn-hangzhou.aliyuncs.com\/loong576/g' recommended.yaml
#由于默认的镜像仓库网络访问不通,故改成阿里镜像
2.2 外网访问
sed -i '/targetPort: 8443/a\ \ \ \ \ \ nodePort: 30001\n\ \ type: NodePort' recommended.yaml
#配置NodePort,外部通过https://NodeIp:NodePort 访问Dashboard,此时端口为30001
3. 部署
3.1 部署Dashboard
kubectl apply -f recommended.yaml
3.2 状态查看
kubectl get all -n kubernetes-dashboard
3.3 令牌生成
创建service account并绑定默认cluster-admin管理员集群角色:
# 创建用户
kubectl create serviceaccount dashboard-admin -n kube-system
# 用户授权
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
3.4 令牌查看
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
4.访问
外部通过https://NodeIp:NodePort 访问Dashboard,此时端口为30001,默认运行在master节点上
选择token方式登录,输入“3.4 令牌查看” 获得的token,即可进入页面
注意:
默认情况下只能使用https访问,但chrome可能会提示不安全,此时在浏览器当前页面下键盘敲击thisisunsafe可继续访问,
火狐浏览器可正常进入,不会提示不安全。
token失效较快,可设置参数延长失效时间- --token-ttl=43200