首页 > 编程学习 > kubernetes1.18集群安装实战

kubernetes1.18集群安装实战

发布时间:2022/10/1 9:18:35

一、K8s单master和单node节点搭建

1、准备实验环境

1. 准备三台centos7虚拟机,用来安装k8s集群,下面是三台虚拟机的配置情况

master1192.168.1.10)配置:

操作系统:centos7.4、centos7.5、centos7.6以及更高版本都可以;

配置:4核cpu,6G内存,两块40G硬盘;

网络:桥接网络;

Node1(192.168.1.11)配置:

操作系统:centos7.4、centos7.5、centos7.6以及更高版本都可以;

配置:4核cpu,6G内存,两块40G硬盘;

网络:桥接网络;

2、初始化实验环境

1)设置主机名

hostnamectl set-hostname k8s-master

让每台机子可以相互解析在添加:

vi /etc/hosts
192.168.1.10 k8s-master
192.168.1.11 k8s-node

2)安装基础软件包

各个节点操作:

yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git ntpdate

3)关闭firewalld防火墙

各个节点操作,centos7系统默认使用的是firewalld防火墙,停止firewalld防火墙,并禁用这个服务:

swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

4)时间同步,各个节点操作

时间同步:

ntpdate cn.pool.ntp.org

编辑计划任务,每小时做一次同步:

crontab -e
* */1 * * * /usr/sbin/ntpdate   cn.pool.ntp.org

5)修改内核参数,各个节点操作

调整内核参数,对于K8S:

cat > /etc/sysctl.d/kubernetes.conf << EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0 # 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它
vm.overcommit_memory=1 # 不检查物理内存是否够用
vm.panic_on_oom=0 # 开启 OOM
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
EOF

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

6)升级系统内核为 4.44

# CentOS 7.x 系统自带的 3.10.x 内核存在一些 Bugs,导致运行的 Docker、Kubernetes 不稳定,查看内核命令uname -r,升级步骤如下:
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm#安装完成后检查 /boot/grub2/grub.cfg 中对应内核 menuentry 中是否包含 initrd16 配置,如果没有,再安装一次!
yum --enablerepo=elrepo-kernel install -y kernel-lt#设置开机从新内核启动
grub2-set-default "CentOS Linux (4.4.182-1.el7.elrepo.x86_64) 7 (Core)"# 重启
reboot# 查看内核变化啦

3、安装kubernetes1.18高可用集群

1)安装docker

yum install wget

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

yum -y install docker-ce-18.06.1.ce-3.el7

systemctl enable docker && systemctl start docker #启动并设置开机启动

2)配置阿里云镜像docker加速器

cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["http://6e9e5b27.m.daocloud.io"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
EOF

重启docker:

systemctl daemon-reload && systemctl restart docker && systemctl enable docker.service

3)安装Kubeadm、 kubectl和 kubelet

# 配置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
sudo yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
sudo systemctl restart kubelet
sudo systemctl enable kubelet

部署Kubernetes Master:

kubeadm init \
--apiserver-advertise-address=192.168.5.10 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.18.0 \
--service-cidr=10.1.0.0/16 \

拷贝一下这里打印出来的1条kubeadm join命令:

#配置环境变量
mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

4)安装calico网络 --master节点

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
kubectl get node -o wide

5)子节点加入

上面组件都安装之后,kubectl get pods -n kube-system -o wide,查看组件安装是否正常,STATUS状态是Running,说明组件正常。

6)发布项目与测试 

kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort

使用yml文件发布nginx :

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 4
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.8   #使用镜像nginx:1.8替换原来的nginx:1.7.9
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service   #Service 的名称
  labels:       #Service 自己的标签
    app: nginx  #为该 Service 设置 key 为 app,value 为 nginx 的标签
spec:       #这是关于该 Service 的定义,描述了 Service 如何选择 Pod,如何被访问
  selector:         #标签选择器
    app: nginx  #选择包含标签 app:nginx 的 Pod
  ports:
  - name: nginx-port    #端口的名字
    protocol: TCP           #协议类型 TCP/UDP
    port: 80            #集群内的其他容器组可通过 80 端口访问 Service
    nodePort: 32600   #通过任意节点的 32600 端口访问 Service
    targetPort: 80      #将请求转发到匹配 Pod 的 80 端口
  type: NodePort        #Serive的类型,ClusterIP/NodePort/LoaderBalancer

二、K8s单master和多node节点集群搭建

1)根据业务需求需要增加node加点改变架构

配置阿里云yum软件源:

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=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 三者的版本需要统一。

查看kubelet版本:

yum list kubelet --showduplicates | sort -r

选择 kubelet 版本1.19.2,执行下面命令,安装指定版本的kubelet、kubeadm、kubectl安装: 

yum install -y kubelet-1.19.2-0.x86_64 --nogpgcheck kubeadm-1.19.2-0.x86_64 --nogpgcheck
kubectl-1.19.2-0.x86_64 --nogpgcheck kubernetes-cni-0.8.7 –disableexcludes=kubernetes
systemctl enable kubelet && systemctl start kubelet

下面步骤只需要在master节点操作。 

2)初始化Kubernetes Master

--apiserver-advertise-address 为Master的IP:

kubeadm init \
--apiserver-advertise-address=192.168.124.201 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.19.2 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16

此过程利用kubeadm帮我们去安装k8s需要的镜像以及相关插件。

初始化成功会有如下提示:

标红的为node节点加入集群命令,忘了也可以重新生成。 

token是master节点初始化时,如果忘记了。执行以下操作:

kubeadm token create --print-join-command

初始化成功后,为顺利使用kubectl,执行以下命令:

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

执行kubectl get nodes,查看master节点状态:

master 状态为NotReady。

通过如下命令查看kubelet状态:

journalctl -xef -u kubelet -n 20

提示未安装cni 网络插件。

3)安装flannel网络插件(CNI)

该镜像在国外,有可能出现ImagePullError等错误,下面提供几种方法解决。

首先先查看该flannel的yml文件引用了那些镜像,把yml下载下来:

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

查看flannel镜像版本:

cat kube-flannel.yml |grep image|uniq

可以看到镜像版本为image: quay.io/coreos/flannel:v0.13.0-rc2,该镜像非常新,如果该镜像全网都没有,那么就按照下面方法①解决,如果存在,就按照方法②执行。

解决方法:

① 如果你自己有阿里云、腾讯云等服务器,那么直接在自己的服务器上拉取该镜像,下载下来,再在你的虚拟机还原该镜像。

先拉取镜像:

docker pull image: quay.io/coreos/flannel:v0.13.0-rc2

将镜像保存为flannel.tar包:

docker save -o flannel.tar quay.io/coreos/flannel:v0.13.0-rc2

通过FTP将flannel.tar传输到本地的虚拟机。

通过下面命令加载镜像:

docker load -i flannel.tar

查看本地镜像,红色框所示,所需镜像已加载成功:

执行以下命令安装flannel即可:

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

② 修改该yml文件,将镜像版本修改为已有的版本,可在https://github.com/coreos/flannel/releases上查看flannel相关镜像包。

将flannel:v0.12.0-amd64.docker 下载到本地:

修改yml文件镜像源: 

sed -i 's/flannel:v0.13.0-rc2/flannel:v0.12.0-amd64/' kube-flannel.yml 

参考①中,传输镜像到虚拟机装载

同样,执行以下命令安装flannel即可:

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

输入命令kubectl get pods -n kube-system,等待所有插件为running状态。

待所有pod status为Running的时候,再次执行kubectl get nodes: 

4)node节点加入集群

在k8s-node1、k8s-node2等两台虚拟机中按上面的步骤,安装好docker、kubelet、kubectl、kubeadm。

node节点加入集群:

在上面第九步初始化master节点成功后,输出了下面的kubeadm join命令:

该命令就是node加入集群的命令,分别在k8s-node1、k8s-node2上执行该命令加入集群。 

如果忘记该命令,可以通过以下命令重新生成: 

kubeadm token create --print-join-command

在master节点执行下面命令查看集群状态:

kubectl get nodes

如上图所示,所有节点都为ready,集群搭建成功。

三、K8s多master和多node集群搭建

1、准备实验环境

准备三台centos7虚拟机,用来安装k8s集群,下面是三台虚拟机的配置情况:

master1192.168.1.10)配置:

操作系统:centos7.4、centos7.5、centos7.6以及更高版本都可以

配置:4核cpu,6G内存,两块60G硬盘

网络:桥接网络

Master2(192.168.1.11)配置:

操作系统:centos7.4、centos7.5、centos7.6以及更高版本都可以

配置:4核cpu,6G内存,两块60G硬盘

网络:桥接网络

Node2(192.168.1.12)配置:

操作系统:centos7.4、centos7.5、centos7.6以及更高版本都可以

配置:4核cpu,6G内存,两块60G硬盘

网络:桥接网络

2、初始化实验环境

设置主机名:

hostnamectl set-hostname k8s-master

让每台机子可以相互解析 在添加:

vi /etc/hosts
192.168.1.10  apiserver.com

安装基础软件包,各个节点操作:

yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git ntpdate

关闭firewalld防火墙,各个节点操作,centos7系统默认使用的是firewalld防火墙,停止firewalld防火墙,并禁用这个服务:

systemctl  stop firewalld  && systemctl  disable  firewalld
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

时间同步,各个节点操作:

ntpdate cn.pool.ntp.org

编辑计划任务,每小时做一次同步:

crontab -e
* */1 * * * /usr/sbin/ntpdate   cn.pool.ntp.org

修改内核参数,各个节点操作:

调整内核参数,对于K8S。

cat > /etc/sysctl.d/kubernetes.conf << EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0 # 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它
vm.overcommit_memory=1 # 不检查物理内存是否够用
vm.panic_on_oom=0 # 开启 OOM
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
EOF
sysctl -p /etc/sysctl.d/kubernetes.conf

升级系统内核为 4.44(可选):

# CentOS 7.x 系统自带的 3.10.x 内核存在一些 Bugs,导致运行的 Docker、Kubernetes 不稳定,查看内核命令uname -r,升级步骤如下:
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm#安装完成后检查 /boot/grub2/grub.cfg 中对应内核 menuentry 中是否包含 initrd16 配置,如果没有,再安装一次!
yum --enablerepo=elrepo-kernel install -y kernel-lt#设置开机从新内核启动
grub2-set-default "CentOS Linux (4.4.182-1.el7.elrepo.x86_64) 7 (Core)"# 重启
reboot# 查看内核变化啦

3、安装kubernetes1.18高可用集群

1)安装docker

#如果未按照wget命令
yum install wget

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

yum -y install docker-ce-18.06.1.ce-3.el7

systemctl enable docker && systemctl start docker #启动并设置开机启动

docker --version #查看是否安装成功

创建/etc/docker目录,配置docker阿里云镜像加速:

sudo mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["http://6e9e5b27.m.daocloud.io"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
EOF

#重启docker
docker info | grep "Cgroup Driver"

systemctl  daemon-reload
systemctl  restart docker
systemctl enable docker

2)安装Kubeadm、 kubectl和 kubelet

# 配置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

# 安装kubeadm, kubectl, and kubelet.
sudo yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
sudo systemctl restart kubelet
sudo systemctl enable kubelet

3)设置集群主节点配置--master

[root@master keepalived]# cat kubeadm-config.yaml 
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.18.0
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
controlPlaneEndpoint: "vip:6443"
networking:
  serviceSubnet: "10.96.0.0/16"
  podSubnet: "10.100.0.1/16"
  dnsDomain: "cluster.local"

如下命令进行初始化:

 kubeadm init --config=kubeadm-config.yaml --upload-certs

拷贝一下这里打印出来的两条kubeadm join命令,后面添加其他master节点以及worker节点时需要用到:

#配置环境变量
mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

4)安装calico网络 --master节点

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

5)查看节点情况

kubectl get node -o wide

拷贝一下这里打印出来的两条kubeadm join命令,后面添加其他master节点以及worker节点时需要用到。

6)第二台master加入集群

前提第二台master 环境是正常的,docker 和kubelet 安装正常。

就可以执行加入集群,第二台部署成功后执行:

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

加入集群命令保存好,执行就行。

子节点加入:

kubeadm join 192.168.183.10:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:f2a9b77cbe8bdaa9dd8cdcd414fb4a9d09059dfb33ced7f13fc2218f425b6273

注意token是master节点初始化时,生产的如果忘记了。

执行以下操作:

kubeadm token create --print-join-command

上面组件都安装之后,kubectl get pods -n kube-system -o wide,查看组件安装是否正常,STATUS状态是Running,说明组件正常,如下所示:

7) 安装calico网络 --master节点

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

查看pod信息状态:

kubectl get pod --all-namespaces

四、基于kubeadm搭建k8s高可用集群

部署keepalived - apiserver高可用(任选两个master节点):

vim /etc/keepalived/keepalived.conf

global_defs {
 router_id keepalive-master
}

vrrp_script check_apiserver {
 # 检测脚本路径
 script "/etc/keepalived/check-apiserver.sh"
 # 多少秒检测一次
 interval 3
 # 失败的话权重-2
 weight -2
}

vrrp_instance VI-kube-master {
   state MASTER  # 定义节点角色
   interface ens33  # 网卡名称
   virtual_router_id 68
   priority 100
   dont_track_primary
   advert_int 3
   virtual_ipaddress {
     # 自定义虚拟ip
     192.168.5.199
   }
   track_script {
       check_apiserver
   }
}

在m2(角色为backup)上创建配置文件如下:

global_defs {
 router_id keepalive-master
}

vrrp_script check_apiserver {
 # 检测脚本路径
 script "/etc/keepalived/check-apiserver.sh"
 # 多少秒检测一次
 interval 3
 # 失败的话权重-2
 weight -2
}

vrrp_instance VI-kube-master {
   state MASTER  # 定义节点角色
   interface ens33  # 网卡名称
   virtual_router_id 68
   priority 99
   dont_track_primary
   advert_int 3
   virtual_ipaddress {
     # 自定义虚拟ip
     192.168.5.199
   }
   track_script {
       check_apiserver
   }
}
vim /etc/keepalived/check-apiserver.sh
#!/bin/sh
netstat -ntlp |grep 6443 || exit 1
分别在master和backup上启动keepalived服务
$ systemctl enable keepalived && service keepalived start

部署第一个k8s主节点:

kubeadm config images list

使用kubeadm创建的k8s集群,大部分组件都是以docker容器的方式去运行的,所以kubeadm在初始化master节点的时候需要拉取。

创建kubeadm用于初始化master节点的配置文件:

cat <<EOF > ./kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.18.0
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
controlPlaneEndpoint: "vip:6443"
networking:
  serviceSubnet: "10.96.0.0/16"
  podSubnet: "10.100.0.1/16"
  dnsDomain: "cluster.local"
EOF

然后执行如下命令进行初始化:

kubeadm init --config=kubeadm-config.yaml --upload-certs

然后在master节点上执行如下命令拷贝配置文件:

[root@m1 ~]# mkdir -p $HOME/.kube
[root@m1 ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@m1 ~]# chown $(id -u):$(id -g) $HOME/.kube/config

查看当前的Pod信息:

kubectl get pod --all-namespaces

安装calico网络 --master节点:

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

curl -ik https://192.168.5.199:6443/version

kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort

访问地址:http://NodeIP:Port ,此例就是:http://10.10.100.72:32393

五、多master高可用keepalived+lvs负载均衡集群

第一台master keepalived配置:

global_defs {
router_id LVS_DEVEL
}

vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 80
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass just0kk
}
virtual_ipaddress {
192.168.5.199
}
}

virtual_server 192.168.5.199 6443 {
delay_loop 6
lb_algo loadbalance
lb_kind DR
net_mask 255.255.255.0
persistence_timeout 0
protocol TCP


real_server 192.168.5.30 6443 {
weight 1
SSL_GET {
url {
path /healthz
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}

real_server 192.168.5.24 6443 {
weight 1
SSL_GET {
url {
path /healthz
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}

第二台master keepaived:

global_defs {
router_id LVS_DEVEL
}

vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 80
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass just0kk
}
virtual_ipaddress {
192.168.5.199
}
}

virtual_server 192.168.5.199 6443 {
delay_loop 6
lb_algo loadbalance
lb_kind DR
net_mask 255.255.255.0
persistence_timeout 0
protocol TCP


real_server 192.168.5.30 6443 {
weight 1
SSL_GET {
url {
path /healthz
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}

real_server 192.168.5.24 6443 {
weight 1
SSL_GET {
url {
path /healthz
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}

重新初始化master节点:

rm -rf /etc/kubernetes/*
rm -rf ~/.kube/*
rm -rf /var/lib/etcd/*
systemctl stop firewalld 

重置节点:

kubeadm reset

注意token是master节点初始化时,生产的如果忘记了。

执行以下操作:

kubeadm token create --print-join-command

Copyright © 2010-2022 mfbz.cn 版权所有 |关于我们| 联系方式|豫ICP备15888888号