CentOS8上K8S安装部署流程

一、简介

Kubernetes是Google 2014年创建管理的,是Google 10多年大规模容器管理技术Borg的开源版本。它是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。

1、通过Kubernetes你可以:

  • 快速部署应用
  • 快速扩展应用
  • 无缝对接新的应用功能
  • 节省资源,优化硬件资源的使用

2、Kubernetes 特点:

  • 可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)
  • 可扩展: 模块化, 插件化, 可挂载, 可组合
  • 自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展

3、Kubernetes整体架构:

CentOS8上K8S安装部署流程_第1张图片

Master

k8s集群控制节点,对集群进行调度管理,接受集群外用户去集群操作请求。

Master Node 由 API Server、Scheduler、ClusterState Store(ETCD 数据库)和 Controller MangerServer 所组成。

Nodes

集群工作节点,运行用户业务应用容器。

Nodes节点也叫Worker Node,包含kubelet、kube proxy 和 Pod(Container Runtime)。

二、Kubernetes环境搭建方式

部署 Kubernetes 环境(集群)主要有多种方式:

(1)minikube

minikube可以在本地运行Kubernetes的工具,minikube可以在个人计算机(包括Windows,macOS和Linux PC)上运行一个单节点Kubernetes集群,以便您可以试用Kubernetes或进行日常开发工作; 

https://kubernetes.io/docs/tutorials/hello-minikube/ 

(2)kind

Kind和minikube类似的工具,让你在本地计算机上运行Kubernetes,此工具需要安装并配置Docker;

https://kind.sigs.k8s.io/ 

(3)kubeadm

Kubeadm是一个K8s部署工具,提供kubeadm init 和 kubeadm join两个操作命令,可以快速部署一个Kubernetes集群;

官方地址:

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

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

(4)二进制包

从Github下载发行版的二进制包,手动部署安装每个组件,组成Kubernetes集群,步骤比较繁琐,但是能让你对各个组件有更清晰的认识;

(5)yum安装

通过yum安装Kubernetes的每个组件,组成Kubernetes集群,不过yum源里面的k8s版本已经比较老了,所以这种方式用得也比较少了;

(6)第三方工具

有一些大神封装了一些工具,利用这些工具进行k8s环境的安装;

(7)花钱购买

直接购买类似阿里云这样的公有云平台k8s,一键搞定;

三、快速部署:Kubeadm部署Kubernetes

kubeadm是官方社区推出的一个用于快速部署 kubernetes 集群的工具,这个工具能通过两条指令完成一个kubernetes集群的部署。

创建一个Master节点:

kubeadm init 

将Node节点加入到Master集群中:

kubeadm join 

1. 安装要求

  • 在开始之前,部署Kubernetes集群机器需要满足以下几个条件:
  • 3台以上机器,操作系统 CentOS7.7以上64位系统
  • 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多
  • 集群中所有机器之间网络互通
  • 可以访问外网,需要拉取镜像
  • 禁止swap分区

2. 部署内容

  • kubernetes1.21.0版本,docker20.10.22版本
  • 在所有节点上安装Docker和kubeadm,kubenet
  • 部署Kubernetes Master
  • 部署容器网络插件
  • 部署 Kubernetes Node,将节点加入Kubernetes集群中

3. 准备环境

这里我准备了三台机器

ip: 192.168.44.135 主机名:k8s-master-135 系统:centos8 配置:2核2G
ip: 192.168.44.133 主机名:k8s-node-133 系统:centos8 配置:2核2G
ip: 192.168.44.134 主机名:test-node-134 系统:centos8 配置:2核2G

三台主机都需要执行如下命令:

关闭防火墙和selinux

systemctl stop firewalld
systemctl disable firewalld
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0

关闭swap分区(k8s禁止虚拟内存以提高性能)

swapoff -a    # 临时关闭
vim /etc/fstab # 注释到swap那一行  永久关闭

添加主机名与IP对应关系(三台主机都执行)

echo '''
192.168.44.135 k8s-master-135
192.168.44.133 k8s-node-133
192.168.44.134 k8s-node-134
''' >> /etc/hosts

各自修改主机名(从176-178各自顺序执行)

hostnamectl set-hostname k8s-master-135
hostnamectl set-hostname k8s-node-133
hostnamectl set-hostname k8s-node-134

将桥接的IPv4流量传递到iptables的链(三台主机都执行):

以下net.ipv4.ip_forward如存在=0,修改为1即可

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

sysctl --system

时间同步

#启动chronyd服务
systemctl start chronyd
systemctl enable chronyd
date 

Tips:执行命令前 可以 使用 rpm -qa |grep chrony 查看系统是否已安装chrony,没有安装环境可使用 yum
install chrony 命令安装

4. 所有节点安装Docker/kubeadm/kubelet

1)Docker安装

卸载旧版本

Docker的旧版本被称为Docker或Docker引擎。如果安装了这些,请卸载它们以及相关的依赖项。

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

如果 yum 报告未安装这些软件包,则可以。 

更换镜像

wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo #进入yum目录

cd /etc/yum.repos.d

# 删除目录下所有文件(注意完整复制,不要漏了那个点)
rm -rf ./*

# 安装正确的镜像源
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo

# 生成缓存
yum makecache

安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的

yum install -y yum-utils device-mapper-persistent-data lvm2

设置yum源

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

可以查看所有仓库中所有docker版本,并选择特定版本安装

yum list docker-ce --showduplicates | sort -r

 安装docker

yum install -y docker-ce-3:20.10.9-3.el8

如果有问题,参考这里解决:

Centos 8安装Docker及报错解决办法_duansamve的博客-CSDN博客_centos8 docker 安装失败

启动并加入开机启动

systemctl start docker
systemctl enable docker

 验证docker是安装成功

docker version
docker info

配置镜像加速

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://ccdkz6eh.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

2)安装kubeadm,kubelet和kubectl

添加k8s阿里云YUM软件源

所有机器执行

cat < /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 clean all

#把服务器的包信息下载到本地电脑缓存起来,makecache建立一个缓存
yum makecache

#列出kubectl可用的版本
yum list kubectl --showduplicates | sort -r

安装kubeadm,kubelet和kubectl

所有机器执行

yum install -y kubelet-1.21.0 kubeadm-1.21.0 kubectl-1.21.0
systemctl start kubelet
systemctl enable kubelet

查看有没有安装

yum list installed | grep kubelet
yum list installed | grep kubeadm
yum list installed | grep kubectl

查看安装的版本: kubelet --version

Kubelet:运行在cluster所有节点上,负责启动POD和容器;

Kubeadm:用于初始化cluster的一个工具;

Kubectl:kubectl是kubenetes命令行工具,通过kubectl可以部署和管理应用,查看各种资源,创建,删除和更新组件;

CentOS8上K8S安装部署流程_第2张图片

此时应该重启一下centos

reboot

5. 部署k8s的master和node节点

1)部署master节点,在192.168.44.135执行

初始化master节点

kubeadm init --apiserver-advertise-address=192.168.44.135 \
--apiserver-cert-extra-sans=127.0.0.1 \
--image-repository=registry.aliyuncs.com/google_containers \
--ignore-preflight-errors=all \
--kubernetes-version=v1.21.0 \
--service-cidr=10.10.0.0/16 \
--pod-network-cidr=10.18.0.0/16

参数说明

--apiserver-advertise-address=192.168.44.135:这个参数就是master主机的IP地址,例如我的Master主机的IP是:192.168.44.135

--image-repository=registry.aliyuncs.com/google_containers:这个是镜像地址,由于国外地址无法访问,故使用的阿里云仓库地址:registry.aliyuncs.com/google_containers

--kubernetes-version=v1.17.4:这个参数是下载的k8s软件版本号

--service-cidr=10.96.0.0/12:这个参数后的IP地址直接就套用10.96.0.0/12 ,以后安装时也套用即可,不要更改

--pod-network-cidr=10.244.0.0/16:k8s内部的pod节点之间网络可以使用的IP段,不能和service-cidr写一样,如果不知道怎么配,就先用这个10.244.0.0/16

网段问题,两个网段不要重,后面是/16,不要与当前机器网段一样。

如果报错:

CentOS8上K8S安装部署流程_第3张图片

原因分析:

CentOS8上K8S安装部署流程_第4张图片

之前我的Docker是用yum安装的,docker的cgroup驱动程序默认设置为system。默认情况下Kubernetes cgroup为systemd,我们需要更改Docker cgroup驱动。

解决方法:

vim /etc/docker/daemon.json

{
  "exec-opts": ["native.cgroupdriver=systemd"]
}

# 重启docker
systemctl restart docker

# 重新初始化
kubeadm reset # 先重置

#重复上次【初始化master节点】的命令

初始化master节点成功后会返回如下提示:

Your Kubernetes control-plane has initialized successfully!

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.44.135:6443 --token pv0w8v.cit7bb03f5gb083x \
        --discovery-token-ca-cert-hash sha256:fc10d7dd98e4ac9d6fae019c98dd4a247b88d3a9bc72510ab2f3ecd3383848a0 

其中有生成一串命令用于node节点的加入,记录下来,接着执行以下命令

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

2)部署node节点,在192.168.44.133和192.168.44.134执行

这里复制上面生成的一串命令,我这里只是示例,命令根据你实际生成的复制去node节点执行

kubeadm join 192.168.44.135:6443 --token pv0w8v.cit7bb03f5gb083x \
        --discovery-token-ca-cert-hash sha256:fc10d7dd98e4ac9d6fae019c98dd4a247b88d3a9bc72510ab2f3ecd3383848a0 

3)验证 

node节点上执行

kubectl get nodes

master节点192.168.44.135上执行

kubectl get nodes

CentOS8上K8S安装部署流程_第5张图片

6. 安装网络插件(CNI)

下面两种插件二选一,master上执行,如果是云服务器建议按照flannel,calico可能会和云网络环境有冲突。

1)安装flannel插件(轻量级用于快速搭建使用,初学推荐)

2)安装calico插件(master节点上执行,用于复杂网络环境)

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

如果安装失败,看Calico版本是否与Kubernetes版本匹配:

 System requirements

CentOS8上K8S安装部署流程_第6张图片

 然后查看节点状态:

kubectl get nodes #在master机器上执行

说明还没有就绪,需要等一会儿,然后节点就就绪了。

CentOS8上K8S安装部署流程_第7张图片

至此我们的k8s环境就搭建好了 。

7. 测试kubernetes集群

在Kubernetes集群中创建一个pod,验证是否正常运行

创建一个pod,开放对外端口访问,这里会随机映射一个端口

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

查看pod状态,必须是running状态而且ready是1,并查看nginx svc的80端口映射到了哪个端口

kubectl get pod,svc

访问任意机器的刚刚查看的映射端口,看看是否nginx已经运行。

查看运行时容器pod (一个pod里面运行了多个docker容器)

kubectl get pods -n kube-system

四. k8s常用命令

查看pod,service,endpoints,secret等等的状态

kubectl get 组件名 #例如kubectl get pod 查看详细信息可以加上-o wide 其他namespace的指定 -n namespace名

创建,变更一个yaml文件内资源,也可以是目录,目录内包含一组yaml文件(实际使用中都是以yaml文件为主,直接使用命令创建pod的很少,推荐多使用yaml文件)

kubectl apply -f xxx.yaml #例如kubectl apply -f nginx.yaml #这里是如果没有则创建,如果有则变更,比create好用

删除一个yaml文件内资源,也可以是目录,目录内包含一组yaml文件

kubectl delete -f xxx.yaml #例如kubectl delete -f nginx.yaml

查看资源状态,比如有一组deployment内的pod没起来,一般用于pod调度过程出现的问题排查

kubectl describe pod pod名 #先用kubectl get pod查看 #有异常的复制pod名使用这个命令

查看pod日志,用于pod状态未就绪的故障排查

kubectl logs pod名 # 先用kubectl get pod查看 #有异常的复制pod名使用这个命令

查看node节点或者是pod资源(cpu,内存资源)使用情况

kubectl top 组件名 #例如kubectl top node kubectl top pod

进入pod内部

kubectl exec -it pod名 /bin/bash #先用kubectl get pod查看 #有需要的复制pod名使用这个命令

你可能感兴趣的:(Kubernetes,kubernetes,docker)