DevOps工程师技能_容器化技术之K8s集群搭建

   日期:2020-11-10     浏览:93    评论:0    
核心提示:K8s-集群搭建部署说明1、 安装包下载CentOS Linux 7.6 1810 x86 64 iso官方原版镜像下载https://renwole.com/archives/15302、系统环境配置ip addrvi /etc/sysconfig/network-scripts/ifcfg-ens33service network restart3、客户端连接配置4、更新并安装依赖3台机器都需要执行yum -y updateyum install -y conntra

K8s-集群搭建部署说明

1、 安装包下载

CentOS Linux 7.6 1810 x86 64 iso官方原版镜像下载
https://renwole.com/archives/1530

2、系统环境配置

ip addr
vi /etc/sysconfig/network-scripts/ifcfg-ens33
service network restart

3、客户端连接配置

4、更新并安装依赖

3台机器都需要执行

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


准备docker安装包

上传指定位置并安装docker

创建上传目录
mkdir -p /docker/rpm
进入目录
cd /docker/rpm
执行rpm安装命令
rpm -ivh *.rpm

docker 安装报错 container-selinux >= 2.9 解决


解决办法:下载阿里云的repo并安装所需的rpm

   1.安装wget  
      yum install wget    https://blog.csdn.net/FR13DNS/article/details/87555842
        wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo  
  1. 安装epel源
   yum install epel-release
  1. yum install container-selinux
    安装成功后如右图:

    再次安装Docker
    警告:containerd.io-1.2.0-3.el7.x86_64.rpm: 头V4 RSA/SHA512 Signature, 密钥 ID 621e9f35: NOKEY


修改hosts文件

设置master的hostname,并且修改hosts文件

sudo hostnamectl set-hostname m
vi /etc/hosts
192.168.42.132 master
192.168.42.129 work1
192.168.42.130 work2

设置worker01/02的hostname,并且修改hosts文件

sudo hostnamectl set-hostname work1
sudo hostnamectl set-hostname work2

vi /etc/hosts
192.168.42.132 master
192.168.42.129 work1
192.168.42.130 work2

使用ping互相测试一下

系统基础前提配置

(1)关闭防火墙

systemctl stop firewalld && systemctl disable firewalld

(2)关闭selinux

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

(3)关闭swap

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

(4)配置iptables的ACCEPT规则

iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT

(5)设置系统参数

cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sysctl --system

Installing kubeadm, kubelet and kubectl

(1)配置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

(2)安装kubeadm&kubelet&kubectl

 yum install -y kubeadm-1.14.0-0 kubelet-1.14.0-0 kubectl-1.14.0-0 【不推荐,除非熟悉版本匹配】
 yum install -y kubeadm kubelet kubectl

(3)docker和k8s设置同一个cgroup

linux系统创建/etc/docker/daemon.json (mkdir)
 { 
  "registry-mirrors": ["https://zfzbet67.mirror.aliyuncs.com"]
}

docker
vi /etc/docker/daemon.json

    "exec-opts": ["native.cgroupdriver=systemd"],
    
systemctl restart docker
kubelet
sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
	
systemctl enable kubelet && systemctl start kubelet

vi /etc/docker/daemon.json的问题

"/etc/docker/daemon.json" E212: Can't open file for writing

出现这个错误的原因是etc目录下没有docker目录,需要先在etc目录下创建docker文件夹,然后再对daemon。json进行修改。

命令参考

[root@localhost ~]# cd /etc
1
[root@localhost etc]# mkdir docker
1
[root@localhost etc]# cd docker
1
[root@localhost docker]# vi daemon.json


sed:无法读取 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf:没有那个文件或目录看看是不是文件路径写错了!!!

proxy/pause/scheduler等国内镜像

(1)查看kubeadm使用的镜像

kubeadm config images list

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

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

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

set -e

KUBE_VERSION=v1.14.0
KUBE_PAUSE_VERSION=3.1
ETCD_VERSION=3.3.10
CORE_DNS_VERSION=1.3.1

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   

运行脚本和查看镜像 sh ./kubeadm.sh docker images



将这些镜像推送到自己的阿里云仓库【可选,根据自己实际的情况】 登录自己的阿里云仓库

  docker login --username=用户名 registry.cn-qingdao.aliyuncs.com
docker tag quay.io/coreos/hyperkube:v1.7.6_coreos.0 registry.cn-qingdao.aliyuncs.com/jiangp-istio/hyperkube:v1.7.6_coreos.0 
docker tag grafana/grafana:5.2.3 registry.cn-qingdao.aliyuncs.com/jiangp-istio/grafana:5.2.3
docker tag docker.io/prom/prometheus:v2.3.1 registry.cn-qingdao.aliyuncs.com/jiangp-istio/prometheus:v2.3.1
docker tag docker.io/jaegertracing/all-in-one:1.5 registry.cn-qingdao.aliyuncs.com/jiangp-istio/all-in-one:1.5

运行脚本 sh ./kubeadm-push-aliyun.sh

#!/bin/bash

set -e

KUBE_VERSION=v1.14.0
KUBE_PAUSE_VERSION=3.1
ETCD_VERSION=3.3.10
CORE_DNS_VERSION=1.3.1

GCR_URL=k8s.gcr.io
ALIYUN_URL=registry.cn-qingdao.aliyuncs.com/jiangp-k8s

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 tag $GCR_URL/$imageName $ALIYUN_URL/$imageName
  docker push $ALIYUN_URL/$imageName
  docker rmi $ALIYUN_URL/$imageName
done

kube init初始化master

(1)kube init流程

下图对应下一页的重新初始化集群状态:kubeadm reset 需要删除已有文件才能执行ok

01-进行一系列检查,以确定这台机器可以部署kubernetes

02-生成kubernetes对外提供服务所需要的各种证书可对应目录 /etc/kubernetes/pki/*

03-为其他组件生成访问kube-ApiServer所需的配置文件
ls /etc/kubernetes/
admin.conf controller-manager.conf kubelet.conf scheduler.conf
04-为 Master组件生成Pod配置文件。
ls /etc/kubernetes/manifests/.yaml
kube-apiserver.yaml
kube-controller-manager.yaml
kube-scheduler.yaml
05-生成etcd的Pod YAML文件。
ls /etc/kubernetes/manifests/
.yaml
kube-apiserver.yaml
kube-controller-manager.yaml
kube-scheduler.yaml etcd.yaml 06-一旦这些 YAML 文件出现在被 kubelet 监视的/etc/kubernetes/manifests/目录下,kubelet就会自动创建这些yaml文件定义的pod,即master组件的容器。master容器启动后,kubeadm会通过检查localhost:6443/healthz这个master组件的健康状态检查URL,等待master组件完全运行起来

07-为集群生成一个bootstrap token

08-将ca.crt等 Master节点的重要信息,通过ConfigMap的方式保存在etcd中,工后续部署node节点使用

09-最后一步是安装默认插件,kubernetes默认kube-proxy和DNS两个插件是必须安装的

(2)初始化master节点

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

kubeadm init --kubernetes-version=v1.18.3 --pod-network-cidr=10.0.0.0/16 --apiserver-advertise-address=192.168.42.132 --service-cidr 11.0.0.0/12 --image-repository=registry.aliyuncs.com/google_containers

【若要重新初始化集群状态:kubeadm reset,然后再进行上述操作】

查看执行流程使用:kubeadm init --dry-run

记得保存好最后kubeadm join的信息


如果初始化过程出现问题,使用如下命令重置:

kubeadm reset

rm -rf /var/lib/cni/ $HOME/.kube/config

过程中遇到异常:

`[preflight] Some fatal errors occurred:
[ERROR DirAvailable--var-lib-etcd]: /var/lib/etcd is not empty`
直接删除/var/lib/etcd文件夹

 参考文档: https://www.cnblogs.com/hongdada/p/9761336.html

解决办法:

重启一下kubeadm:

[root@k8s-master ~]# kubeadm reset


删除之前已经存在的文件

  rm –f    文件名


解决方法输入

 echo "1" >/proc/sys/net/ipv4/ip_forward 


执行提示命令即可使用集群

检查是否搭建ok

此时kubectl cluster-info查看一下,输出类似于以下信息说明就连接成功了:发现报错

Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes")

解决方法:

先删除 $HOME/.kube

[root@master ~]# rm -rf $HOME/.kube
[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
[root@master ~]# kubectl get svc

查看node状态是否正常 node NotReady 因为没有创建k8s网络插件 ( K8s网络插件flannel与calico)
推荐安装calico

选择网络插件:https://kubernetes.io/docs/concepts/cluster-administration/addons/
calico网络插件:https://docs.projectcalico.org/v3.9/getting-started/kubernetes/

部署calico网络插件

calico,同样在master节点上操作 注意:calico镜像拉取可能拉取比较慢,可以先手动pull一下

docker pull calico/pod2daemon-flexvol:v3.9.1
docker pull calico/kube-controllers:v3.9.1
docker pull calico/cni:v3.9.1
在k8s中安装calico
kubectl apply -f https://docs.projectcalico.org/v3.9/manifests/calico.yaml
确认一下calico是否安装成功
kubectl get pods --all-namespaces -w

显示效果:Pod状态实时更新的

检查集群状态

查看pod验证一下
kubectl get pods -n kube-system

等待一会儿,同时可以发现像etc,controller,scheduler等组件都以pod的方式安装成功了
coredns没有启动,需要安装网络插件,或者网络插件安装有问题

健康检查
   curl -k https://localhost:6443/healthz

kube join 追加node节点

记得保存初始化master节点的最后打印信息【注意这边大家要自己的,下面我的只是一个参考】

![(1)在woker01和worker02上执行上述命令
(2)在master节点上检查集群信息
  kubectl get nodes](https://img-blog.csdnimg.cn/20201108171213846.png#pic_center)
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

master节点上检查集群信息

kubectl get nodes查看集群状态


到此K8s集群搭建成功了!

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服