(1 / 3)CentOS搭建K8s微服务20条

2023-01-09 18:46:48 浏览数 (1)

1、安装要求

在开始之前,部署Kubernetes集群机器需要满足以下几个条件:

  • 一台或多台机器,操作系统 CentOS7.x-86_x64
  • 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多
  • 可以上网,需要拉取镜像
  • 禁止swap分区

2、准备环境

k8s(微服务)

master01 192.168.0.66 zwinfo node01 192.168.0.67 zwinfo node02 192.168.0.68 zwinfo

名称 版本 docker-ce 20.10.10 docker-ce-cli 20.10.10 containerd.io 1.4.12 kubeadm 1.20.9 kubelet 1.20.9 kubectl 1.20.9 kubernetes-cni 0.8.7

openwrt(访问国外网站)

192.168.0.99

nfs(文件服务器)

192.168.0.66

系统升级

所有主机都执行

安装elrepo源

代码语言:javascript复制
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org # 导入elrepo的签名
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-5.el7.elrepo.noarch.rpm # 升级elrepo源

查看可以安装的系统内核版本

代码语言:javascript复制
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available

升级系统内核

代码语言:javascript复制
yum --enablerepo=elrepo-kernel install kernel-lt kernel-lt-devel -y

查看系统内核序号

代码语言:javascript复制
awk -F' '$1=="menuentry " {print i   " : " $2}' /etc/grub2.cfg
或者
rpm -qa kernel

选择默认系统内核

代码语言:javascript复制
grub2-set-default 0

重启

代码语言:javascript复制
reboot

初始化系统环境

所有主机都执行

代码语言:javascript复制
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

# 关闭selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config # 永久关闭selinux(重启后生效)
setenforce 0 # 临时关闭selinux(不需要重启,立即生效)

# 关闭swap
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久关闭swap(重启后生效)
swapoff -a # 临时关闭swap(不需要重启,立即生效)

# 设置主机名
hostnamectl --static set-hostname master01
#hostnamectl --static set-hostname node01
#hostnamectl --static set-hostname node02

# 在master添加hosts
cat >> /etc/hosts << EOF
192.168.0.66 master01
192.168.0.67 node01
192.168.0.68 node02
EOF

# 将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/kubernetes.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system  # 立即生效

# 时间同步
yum install ntpdate -y
ntpdate -u pool.ntp.org 
# 添加定时
crontab  -l
*/20 * * * * /sbin/ntpdate -u pool.ntp.org > /dev/null 2>&1

3、部署Docker

所有主机都执行

代码语言:javascript复制
#安装wget
yum install wget -y
#下载docker-ce源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
#查看可以安装的docker版本
yum list docker-ce --showduplicates | sort -r
#安装docker
yum install -y docker-ce-20.10.10 docker-ce-cli-20.10.10 containerd.io-1.4.12
#查看docker版本
docker -v
#创建docker配置目录
mkdir /etc/docker
#配置docker源
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://anson.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"insecure-registries": ["harbor.anson.cn"]
}
EOF
#重载
systemctl daemon-reload
#设置开机启动
systemctl enable docker
#启动docker服务
systemctl start docker

4、安装kubeadm

所有主机上执行

代码语言:javascript复制
#添加阿里yum源
cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
       https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
#安装kubeadm
yum -y install kubeadm-1.23.4 kubelet-1.23.4  kubectl-1.23.4
#设置开机启动
systemctl enable kubelet
#启动kubelet服务
systemctl start kubelet

5、部署kubernetes

只在master上执行 (失败重置命令 kubeadm reset )

生成初始化文件kubeadm-config.yaml

代码语言:javascript复制
kubeadm config print init-defaults > kubeadm-config.yaml

修改配置文件

代码语言:javascript复制
vi kubeadm-config.yaml

修改如下注释部分

代码语言:javascript复制
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: 4jvhpu.xxxxxx# 随便设置个token,或者删除bootstrapTokens
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.0.66 # 修改为master01的ip地址
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: master01 # 修改为master01的节点名称,host保持一致
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers # 修改为阿里云镜像仓库
kind: ClusterConfiguration
kubernetesVersion: v1.20.0
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
  podSubnet: 10.244.0.0/16 # 添加pod子网
scheduler: {}

拉取镜像

代码语言:javascript复制
kubeadm config images pull --config kubeadm-config.yaml

初始化master

代码语言:javascript复制
kubeadm init --config kubeadm-config.yaml

按照提示执行命令

代码语言:javascript复制
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

查看master是否安装成功

代码语言:javascript复制
kubectl get node

6、添加node节点

所有node上执行

使用在master上生成的口令直接在node上执行

如果已经消失使用kubeadm token create --print-join-command重新生成即可

代码语言:javascript复制
kubeadm join 192.168.0.66:6443 --token abcdef.01xxxx3456789abcdef 
    --discovery-token-ca-cert-hash sha256:92b7ba32b5f23d6d43ee8a2b7273be234dxxxxxx7dcb7adce7ff10fcd5beb4be0bc

等待一会,在master上查看node节点是否添加成功

代码语言:javascript复制
kubectl get node

7、安装CNI网络

只在master上执行,这里选择使用flannel,github地址https://github.com/flannel-io/flannel

添加CNI网络

k8s并没有专门的网络模块负责网络配置,它需要用户在主机上已经配置好网络。

  • 容器之间(包括同一台主机上的容器,和不同主机的容器)可以互相通信
  • 容器和集群中所有的节点也能直接通信
代码语言:javascript复制
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

等待一会,查看节点状态

代码语言:javascript复制
kubectl get node

测试集群

代码语言:javascript复制
#让master也可以部署应用
kubectl taint node master01 node-role.kubernetes.io/master:NoSchedule-
#部署一个测试web服务器
kubectl create deployment web --image=nginx
#暴露端口
kubectl expose deployment web --port=80 --target-port=80 --type=NodePort
#扩容
kubectl scale deployment web --replicas=3
#查看状态
kubectl get pod,svc

0 人点赞