K8s集群介绍及kubeadm方法搭建

这个是我很早之前记录的,当时稀里糊涂的做了,以后有更深刻理解再修改

一、docker三剑客

①、docker machine

用于在虚拟机安装容器引擎以及管理主机

②、docker compose

能够通过yaml文件在容器主机上完成多个应用

③、docker swarm

管理docker容器主机集群

二、K8s功能

1、自动装箱

配置好资源可自动部署应用容器

2、自我修复

①、容器失败,自动重启

②、部署的node(主机)节点有问题,会自动对容器重新进行部署和调整

③、容器未通过监控检查时,会关闭容器

④、直到容器正常运行时,才会对外提供服务

3、水平扩展

可对应用容器进行规模扩大或者裁剪

4、服务发现

不需要额外服务,自己就能自动实现发现和负载均衡能力

5、滚动更新

可以一次性或批量更新

6、版本回退

向前或向后都可

7、密钥配置管理

可直接进行部署和更新密钥和应用配置,类似于热部署

8、存储编排

三、K8s集群介绍

K8s集群属于中心节点架构。由Master Node和Worker Node节点组成
Master Node属于控制节点,对集群进行调度管理,接受群外用户访问集群操作请求
Worker Node属于工作节点,负责运行业务应用容器

Master Node:API server、Scheduler、ETCD数据库、Controller Manger Server
Worker Node:kubelet、kube proxy、container runtime

四、kubeadm集群搭建

1、前期准备工作

**注:**系统准备3台centos7,因为centos8支持podman,安装docker时比较麻烦

1、初期准备,比如关闭防火墙,selinux,swap分区,以及配置所有主机的域名解析

2、添加网桥过滤规则:

①、

vim /etc/sysctl.d/k8s.conf

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0 #swap关闭就不用加了

②、

modprobe br_netfilter
lsmod | grep br_netfilter

③、

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

3、开启ipvs:ip虚拟服务器,可以提供虚拟vip

yum install -y ipset ipvsadm

vim /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4

chmod 755 /etc/sysconfig/modules/ipvs.modules

bash /etc/sysconfig/modules/ipvs.modules

lsmod |grep ip_vs

4、所有节点都安装docker-ce

因为k8s集群不能直接管理容器,它的最小管理单元是pod,所以它需要借助于docker管理工具。

最好安装指定版本的docker-ce-18.06.3.ce-3.el7,如果是其他版本,就将/lib/systemd/system/docker.service中ExecStart中-H及以后的内容。

开机自启并启动docker服务

vim /etc/docker/daemon.json
{
        "exec-opt": ["native.cgroupdriver=systemd"]
}

systemctl restart docker

5、k8s所需软件安装及配置

①、安装

注:在阿里云配置kubernets的yum源

kubeadm:初始化集群、管理集群等

kubelet:接受api-server指令,对pod生命周期进行管理

kubectl:集群命令管理命令

vim /etc/yum.repos.d/k8s.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
       
yum list |grep kubeadm #注意会挺住等待你输入y,来确认是否导入GPG

yum install -y kubeadm kubelet kubectl

②、配置kubelet

由于kubelet与docker默认使用的cgroupdriver不一致,所以修改kubelet配置文件

vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"

由于还未使用kubeadm初始化,在初始化的时候才会生成kubelet的配置文件,所以现在只需要设置开机自启就可以了。

2、初始化部署

1、由于kubeadm部署集群,所有核心组件都以pod(容器)运行,所以需准备镜像。

Master节点:

kubeadm config images list #查看需那些核心组件

#编写一个脚本,由于goole连接不上,所以使用阿里
kubeadm config images list >> images.list

vim images.list
#!/bin/bash
#指定阿里仓库
DOCKER_HUB=registry.cn-hangzhou.aliyuncs.com/google_containers
#原生仓库
YUANLAI_HUB=k8s.gcr.io
#镜像变量
images='/kube-apiserver:v1.19.4
/kube-controller-manager:v1.19.4
/kube-scheduler:v1.19.4
/kube-proxy:v1.19.4
/pause:3.2
/etcd:3.4.13-0
/coredns:1.7.0'
#拉取,并标签为原生标签
for img in ${images};do
    docker pull ${DOCKER_HUB}${img}
    docker tag ${DOCKER_HUB}${img} ${YUANLAI_HUB}${img}
    docker rmi ${DOCKER_HUB}${img}
done

Worker节点:

只需要将主节点中的kube-proxypause打包,传到worker节点就可以了。

2、集群初始化:Master节点操作

初始化:检查使用的版本;检查镜像是否准备(上一步已准备);交换分区情况;启动kubelet;生成各个组件证书;生成各种配置文件。

kubeadm init --apiserver-advertise-address=10.0.0.100 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.19.3 --pod-network-cidr=10.244.0.0/16

工作节点:

kubeadm join 10.0.0.100:6443 --token 1gkiq9.bhlaqcdunhtd2jm8     --discovery-token-ca-cert-hash sha256:f3a6042d206adc795187ea4c95a4c9bcc2f65e17c9b64357a60b12b13d05e0ae[preflight] Running pre-flight checks

五、问题

1、主节点出现的问题:

[root@master1 ~]#kubectl get nodes
NAME      STATUS   ROLES    AGE   VERSION
master1   Ready    master   27h   v1.19.3

[root@master1 ~]#kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS      MESSAGE                                                                                       ERROR
scheduler            Unhealthy   Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refused
controller-manager   Unhealthy   Get "http://127.0.0.1:10252/healthz": dial tcp 127.0.0.1:10252: connect: connection refused
etcd-0               Healthy     {"health":"true"}

解决:

1、先查看本地的端口,可以确认没有启动10251、10252端口,没有启动就说明有错

2、修改scheduler和controller-manager

vim /etc/kubernetes/manifests/kube-scheduler.yaml
vim /etc/kubernetes/manifests/kube-controller-manager.yaml

#把--port=0给注释掉
#    - --port=0

systemctl restart kubelet

再次检查:

[root@master1 ~]#ss -ntl
State      Recv-Q Send-Q                                               Local Address:Port                                                              Peer Address:Port
LISTEN     0      128                                                      127.0.0.1:10248                                                                        *:*
LISTEN     0      128                                                      127.0.0.1:10249                                                                        *:*
LISTEN     0      128                                                      127.0.0.1:2379                                                                         *:*
LISTEN     0      128                                                     10.0.0.100:2379                                                                         *:*
LISTEN     0      128                                                     10.0.0.100:2380                                                                         *:*
LISTEN     0      128                                                      127.0.0.1:2381                                                                         *:*
LISTEN     0      128                                                      127.0.0.1:10257                                                                        *:*
LISTEN     0      128                                                      127.0.0.1:10259                                                                        *:*
LISTEN     0      128                                                      127.0.0.1:46580                                                                        *:*
LISTEN     0      128                                                              *:22                                                                           *:*
LISTEN     0      100                                                      127.0.0.1:25                                                                           *:*
LISTEN     0      128                                                           [::]:10250                                                                     [::]:*
LISTEN     0      128                                                           [::]:10251                                                                     [::]:*
LISTEN     0      128                                                           [::]:6443                                                                      [::]:*
LISTEN     0      128                                                           [::]:10252                                                                     [::]:*
LISTEN     0      128                                                           [::]:10256                                                                     [::]:*
LISTEN     0      128                                                           [::]:22                                                                        [::]:*
LISTEN     0      100                                                          [::1]:25                                                                        [::]:*                      [::]:*

[root@master1 ~]#kubectl get nodes
NAME      STATUS   ROLES    AGE   VERSION
master1   Ready    master   27h   v1.19.3
[root@master1 ~]#kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS    MESSAGE             ERROR
scheduler            Healthy   ok
controller-manager   Healthy   ok
etcd-0               Healthy   {"health":"true"}

2、从节点加入时报错

由于加入主节点有两个认证,一个是token,另一个是主节点创建时生成的hash,hash是不变的,但是token失效了。

[root@worker2 ~]#kubeadm join 10.0.0.100:6443 --token 1gkiq9.bhlaqcdunhtd2jm8     --discovery-token-ca-cert-hash sha256:f3a6042d206adc795187ea4c95a4c9bcc2f65e17c9b64357a60b12b13d05e0ae[preflight] Running pre-flight checks
        [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/
error execution phase preflight: couldn't validate the identity of the API Server: could not find a JWS signature in the cluster-info ConfigMap for token ID "1gkiq9"
To see the stack trace of this error execute with --v=5 or higher

解决办法:主节点生成新的token,从节点去添加

[root@master1 ~]#kubeadm token create
W1113 17:09:58.951005   14398 configset.go:348] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
r0d1gj.qturo8s7g64gac60

从节点加入:

kubeadm join 10.0.0.100:6443 --token r0d1gj.qturo8s7g64gac60  --discovery-token-ca-cert-hash sha256:f3a6042d206adc795187ea4c95a4c9bcc2f65e17c9b64357a60b12b13d05e0ae
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值