ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Kubernetes 1.21.1集群1M2W 环境搭建

2021-06-15 23:58:28  阅读:256  来源: 互联网

标签:yes Kubernetes 1M2W 192.168 nginx ifup kubeadm kube 1.21


Kubernetes 1.21.1集群1M2W 环境搭建

集群说明

操作系统& 内核ip角色kubeadm versiondocker version
Centos7 3.10.0-1160.25.1.el7.x86_64192.168.56.186Master1.21.120.10.7
Centos7 3.10.0-1160.25.1.el7.x86_64192.168.56.187worker1.21.120.10.7
Centos7 3.10.0-1160.25.1.el7.x86_64192.168.56.188worker1.21.120.10.7

官方参考

官网:https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

GitHub:https://github.com/kubernetes/kubeadm

配置要求

  • 一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令
  • 每台机器 2 GB 或更多的 RAM (如果少于这个数字将会影响你应用的运行内存)
  • 2 CPU 核或更多
  • 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)
  • 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。请参见这里了解更多详细信息。
  • 开启机器上的某些端口。请参见这里 了解更多详细信息。
  • 禁用交换分区。为了保证 kubelet 正常工作,你 必须 禁用交换分区。

每个节点的检查环节

MAC 地址唯一性

  • 你可以使用命令 ip linkifconfig -a 来获取网络接口的 MAC 地址
# mac 地址校验
ifconfig -a

product_uuid 的唯一性

  • 可以使用 sudo cat /sys/class/dmi/id/product_uuid 命令对 product_uuid 校验

一般来讲,硬件设备会拥有唯一的地址,但是有些虚拟机的地址可能会重复。 Kubernetes 使用这些值来唯一确定集群中的节点。

#  product_uuid 校验
sudo cat /sys/class/dmi/id/product_uuid

允许 iptables 检查桥接流量

确保 br_netfilter 模块被加载。这一操作可以通过运行 lsmod | grep br_netfilter 来完成。若要显式加载该模块,可执行 sudo modprobe br_netfilter

[root@w2 ~]# lsmod | grep br_netfilter
br_netfilter           22256  0 
bridge                151336  1 br_netfilter

为了让你的 Linux 节点上的 iptables 能够正确地查看桥接流量,你需要确保在你的 sysctl 配置中将 net.bridge.bridge-nf-call-iptables 设置为 1

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

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

系统版本统一

内核版本

Docker 要求 CentOS 系统的内核版本高于 3.10

$ uname -r
3.10.0-1160.25.1.el7.x86_64

系统基础前提配置

# 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld

# 关闭selinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

# 关闭swap
swapoff -a
sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab

# 配置iptables的ACCEPT规则
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT

# 时钟同步
yum install ntpdate -y && ntpdate time.windows.com

网络配置

访问外网

每个节点需要开启NAT网络模式,可访问宿主机的外网环境

配置网卡网段

大家根据自己的情况来准备centos7的虚拟机。

要保证彼此之间能够ping通,也就是处于同一个网络中

也可以按如下操作:

虚拟机开启Host-Olny模式,默认会开启56网段

三台机器配置同网段的虚拟网卡-ifcfg-enp0s8

#进入网卡配置路径下
[root@bogon network-scripts]# cd /etc/sysconfig/network-scripts/
[root@bogon network-scripts]# ls
ifcfg-enp0s8  ifdown-ippp    ifdown-Team      ifup-ib     ifup-ppp       init.ipv6-global
ifcfg-enp0s9  ifdown-ipv6    ifdown-TeamPort  ifup-ippp   ifup-routes    network-functions
ifcfg-lo      ifdown-isdn    ifdown-tunnel    ifup-ipv6   ifup-sit       network-functions-ipv6
ifdown        ifdown-post    ifup             ifup-isdn   ifup-Team
ifdown-bnep   ifdown-ppp     ifup-aliases     ifup-plip   ifup-TeamPort
ifdown-eth    ifdown-routes  ifup-bnep        ifup-plusb  ifup-tunnel
ifdown-ib     ifdown-sit     ifup-eth         ifup-post   ifup-wireless

186机器

[root@bogon network-scripts]# vi ifcfg-enp0s8
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=enp0s8
UUID=2f812198-74d6-4d6a-9fcd-8f6d1058b686
DEVICE=enp0s8
ONBOOT=yes
IPADDR=192.168.56.186
GETEWAY=192.168.56.1
NETMASK=255.255.255.0

187机器

[root@bogon network-scripts]# vi ifcfg-enp0s8
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=enp0s8
UUID=2f812198-74d6-4d6a-9fcd-8f6d1058b687
DEVICE=enp0s8
ONBOOT=yes
IPADDR=192.168.56.187
GETEWAY=192.168.56.1
NETMASK=255.255.255.0

188机器

[root@bogon network-scripts]# vi ifcfg-enp0s8
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=enp0s8
UUID=2f812198-74d6-4d6a-9fcd-8f6d1058b688
DEVICE=enp0s8
ONBOOT=yes
IPADDR=192.168.56.188
GETEWAY=192.168.56.1
NETMASK=255.255.255.0

修改hosts文件

三台机器设置hosts

vi /etc/hosts
192.168.56.186 m
192.168.56.187 w1
192.168.56.188 w2

设置hostname,也就是用别名替代IP

# 设置186的hostname
sudo hostnamectl set-hostname m
# 设置187的hostname
sudo hostnamectl set-hostname w1
# 设置188的hostname
sudo hostnamectl set-hostname w2

使用ping测试一下

ping m
ping w1
ping w2

每个节点安装docker和kube

更新并安装依赖

3台机器都需要执行

yum -y update
yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp

安装Docker

官方参考

官方安装手册 https://docs.docker.com/engine/install/centos/

在每一台机器上都安装好Docker,版本为20.10.7

01 安装必要的依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

02 设置docker仓库
	sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
	
【设置要设置一下阿里云镜像加速器】
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["这边替换成自己的实际地址"]
}
EOF
sudo systemctl daemon-reload

03 安装docker
yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io


04 启动docker&开机运行docker
	sudo systemctl start docker && sudo systemctl enable docker

安装kubeadm, kubelet, kubectl

配置yum源

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

yum  makecache -y fast

安装kubeadm&kubelet&kubectl

#安装 &开机启动kubelet & 启动kubelet
yum install -y kubectl-1.21.1 kubelet-1.21.1 kubeadm-1.21.1
systemctl enable kubelet
systemctl start kubelet

docker和k8s设置同一个cgroup

# docker
vi /etc/docker/daemon.json
    "exec-opts": ["native.cgroupdriver=systemd"],
    
systemctl restart docker
    
# kubelet,这边如果发现输出directory not exist,也说明是没问题的,大家继续往下进行即可
sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

使用阿里云下载镜像

查看kubeadm使用的镜像

可以发现这里都是国外的镜像

kubeadm config images list

k8s.gcr.io/kube-apiserver:v1.21.1
k8s.gcr.io/kube-controller-manager:v1.21.1
k8s.gcr.io/kube-scheduler:v1.21.1
k8s.gcr.io/kube-proxy:v1.21.1
k8s.gcr.io/pause:3.4.1
k8s.gcr.io/etcd:3.4.13-0
k8s.gcr.io/coredns/coredns:v1.8.0

解决国外镜像不能访问的问题

使用阿里云拉取镜像后修改tag为k8s需要的镜像

  • 创建kubeadm.sh脚本,用于拉取镜像/打tag/删除原有镜像

vi kubeadm.sh

  #!/bin/bash
  set -e
  KUBE_VERSION=v1.21.1
  KUBE_PAUSE_VERSION=3.4.1
  ETCD_VERSION=3.4.13-0
  CORE_DNS_VERSION=1.8.0
  
  GCR_URL=k8s.gcr.io
  ALIYUN_URL=registry.cn-hangzhou.aliyuncs.com/google_containers
  
  images=(kube-proxy:${KUBE_VERSION}
  kube-scheduler:${KUBE_VERSION}
  kube-controller-manager:${KUBE_VERSION}
  kube-apiserver:${KUBE_VERSION}
  pause:${KUBE_PAUSE_VERSION}
  etcd:${ETCD_VERSION}
  coredns:${CORE_DNS_VERSION})
  
  for imageName in ${images[@]} ; do
    docker pull $ALIYUN_URL/$imageName
    docker tag  $ALIYUN_URL/$imageName $GCR_URL/$imageName
    docker rmi $ALIYUN_URL/$imageName
  done
  
  docker tag k8s.gcr.io/coredns:1.8.0 k8s.gcr.io/coredns/coredns:v1.8.0
  echo '镜像下载成功,将打印镜像列表';
  docker images|grep k8s.gcr.io
  echo '将执行 kubeadm config images list';
  kubeadm config images list
  echo '请对比镜像的名称和tag';
  • 运行脚本和查看镜像
# 运行脚本
sh ./kubeadm.sh
  • 对比镜像的名称和tag

Master初始化过程

kube初始化master

注意此操作是在主节点上进行

初始化master节点

官网:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

本地已有 kubeadm config images list 包含的镜像了,执行以下命令

记得保存执行 init 成功最后kubeadm join的信息

# 执行init
kubeadm init --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.21.1 --apiserver-advertise-address=192.168.56.186

# 若一次没成功,要重新初始化集群状态:执行 kubeadm reset,进行上述操作
# 安装好后返回如下信息,后面会使用到
To start using your cluster, you need to run the following as a regular user:

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

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.56.186:6443 --token 71h03b.psh05o31axvp09jg \
	--discovery-token-ca-cert-hash sha256:5ed285e40f048e923d4a0e06dfeaac7f3ffcf20bed6402ee3fec1ee4b42d14d8 

记录你的kubeadm join的命令

kubeadm join 192.168.56.186:6443 --token 71h03b.psh05o31axvp09jg \
	--discovery-token-ca-cert-hash sha256:5ed285e40f048e923d4a0e06dfeaac7f3ffcf20bed6402ee3fec1ee4b42d14d8 

要开始使用集群了,根据提示执行如下

# 非root用户 执行如下
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# root用户也可以这样运行
export KUBECONFIG=/etc/kubernetes/admin.conf

此时kubectl cluster-info查看一下是否成功

查看pod验证一下

等待一会儿,同时可以发现像etc,controller,scheduler等组件都以pod的方式安装成功了

注意:coredns没有启动,需要安装网络插件

kubectl get pods -n kube-system
NAME                        READY   STATUS    RESTARTS   AGE
coredns-558bd4d5db-7zfht    0/1     Pending   0          5m56s
coredns-558bd4d5db-95k88    0/1     Pending   0          5m56s
etcd-m                      1/1     Running   0          6m9s
kube-apiserver-m            1/1     Running   0          6m9s
kube-controller-manager-m   1/1     Running   0          6m9s
kube-proxy-nfvcr            1/1     Running   0          5m56s
kube-scheduler-m            1/1     Running   0          6m8s
# 上面coredns模块没有启动,需要后面安装网络插件

健康检查

curl -k https://localhost:6443/healthz
ok

部署calico网络插件

选择网络插件:https://kubernetes.io/docs/concepts/cluster-administration/addons/

calico网络插件:https://docs.projectcalico.org/v3.9/getting-started/kubernetes/

calico,同样在master节点上操作

# 在k8s中安装calico
kubectl apply -f https://docs.projectcalico.org/v3.9/manifests/calico.yaml

# 确认一下calico是否安装成功
kubectl get pods --all-namespaces -w

工作节点加入集群

kube worker join cluster

还记得初始化master节点的最后打印信息

拿着上面init执行的命令到worker node进行执行

kubeadm join 192.168.56.186:6443 --token 71h03b.psh05o31axvp09jg \
	--discovery-token-ca-cert-hash sha256:5ed285e40f048e923d4a0e06dfeaac7f3ffcf20bed6402ee3fec1ee4b42d14d8

在woker01和worker02上执行上述命令

在master节点上检查集群信息

kubectl get nodes

NAME                   STATUS   ROLES    AGE     VERSION
master-kubeadm-k8s     Ready    master   19m     v1.14.0
worker01-kubeadm-k8s   Ready    <none>   3m6s    v1.14.0
worker02-kubeadm-k8s   Ready    <none>   2m41s   v1.14.0

此时node的STATUS开始是NoReady,此时集群正在建立连接,通过如下命令查看过程

需要等待片刻

kubectl get pods --all-namespaces -w
NAMESPACE         NAME                                       READY   STATUS     RESTARTS   AGE
kube-system       calico-kube-controllers-76bf499b46-mxv6q   0/1     Pending    0          47s
kube-system       calico-node-fn8mx                          0/1     Init:0/3   0          48s
kube-system       calico-node-mpmpt                          0/1     Init:0/3   0          48s
kube-system       calico-node-v4hpf                          0/1     Init:0/3   0          48s
kube-system       coredns-558bd4d5db-7zfht                   0/1     Pending    0          46m
kube-system       coredns-558bd4d5db-95k88                   0/1     Pending    0          46m
kube-system       etcd-m                                     1/1     Running    0          46m
kube-system       kube-apiserver-m                           1/1     Running    0          46m
kube-system       kube-controller-manager-m                  1/1     Running    0          46m
kube-system       kube-proxy-2svlm                           1/1     Running    0          21m
kube-system       kube-proxy-nfvcr                           1/1     Running    0          46m
kube-system       kube-proxy-tpqlk                           1/1     Running    0          21m
kube-system       kube-scheduler-m                           1/1     Running    0          46m
tigera-operator   tigera-operator-86c4fc874f-kw2dd           1/1     Running    0          31m

等待所有的status变成Running,node的状态才会变成Ready

都变成Ready状态后集群即搭建成功。

验证阶段

发布Pod,验证集群安装状态

定义pod.yml文件,比如pod_nginx_rs.yaml

cat > pod_nginx_rs.yaml <<EOF
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx
  labels:
    tier: frontend
spec:
  replicas: 3
  selector:
    matchLabels:
      tier: frontend
  template:
    metadata:
      name: nginx
      labels:
        tier: frontend
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
EOF

根据pod_nginx_rs.yml文件创建pod

kubectl apply -f pod_nginx_rs.yaml 
replicaset.apps/nginx created

查看pod

kubectl get pods
# 需等待1分钟 才有如下结果
NAME          READY   STATUS    RESTARTS   AGE
nginx-2zl2r   0/1     Pending   0          66s
nginx-74x6h   0/1     Pending   0          66s
nginx-wbwjx   0/1     Pending   0          66s

#大约2分钟后查看运行详情
kubectl get pods -o wide
NAME          READY   STATUS    RESTARTS   AGE     IP               NODE   NOMINATED NODE   READINESS GATES
nginx-2zl2r   1/1     Running   0          3m18s   192.168.80.195   w2     <none>           <none>
nginx-74x6h   1/1     Running   0          3m18s   192.168.80.196   w2     <none>           <none>
nginx-wbwjx   1/1     Running   0          3m18s   192.168.190.66   w1     <none>           <none>

# 查看详细的运行情况
kubectl describe pod nginx

验证nginx

# 在集群内运行一下三行都可以返回结果
curl 192.168.80.195
curl 192.168.80.196
curl 192.168.190.66

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

删除pod

kubectl delete -f pod_nginx_rs.yaml

标签:yes,Kubernetes,1M2W,192.168,nginx,ifup,kubeadm,kube,1.21
来源: https://blog.csdn.net/xianghanscce/article/details/117935632

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有