一文读懂运维虚拟化之K8S测试集群搭建

本文详细介绍了Kubernetes的核心组件、控制节点与工作节点的功能,以及如何通过kubeadm进行集群环境的搭建,包括主机规划、安装docker、kubernetes组件的安装、网络插件flannel的配置和Nginx服务的部署测试。
摘要由CSDN通过智能技术生成

本文概览

一、K8S概述
  (一)、控制节点(master)
    1、ApiServer
    2、Scheduler
    3、ControllerManager
    4、Etcd
  (二)、工作节点(node)
    1、Kubelet
    2、KubeProxy
    3、Docker
    
二、K8S集群环境搭建
  (一)、集群简介
    1、集群类型
    2、安装方式
  (二)、集群环境搭建
    1、主机规划
    2、环境初始化
    3、安装docker
    4、安装kubernetes组件
    5、准备集群镜像
    6、集群初始化
   7、安装网络插件
  (三)、服务部署测试

一、K8S概述

Kubernetes是 Google 团队发起并维护的开源容器集群管理系统,支持如 Docke 等容器技术。类似Docker Swarm ,使用 Kubernetes ,用户可以轻松搭建和管理一个私有容器云

Kubernetes主要架构如下图所示

(一)控制节点(master)

集群的控制节点,负责集群的决策、管理,每个集群需要至少一个master节点负责集群的管控。

1ApiServer

资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制。

2Scheduler

负责集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上。

3ControllerManager

负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新等。

4Etcd

负责存储集群中各种资源对象的信息。

(二)工作节点(node)

集群的工作负载节点,负责为容器提供运行环境,由master分配容器到这些node工作节点上,然后node节点上的docker负责容器的运行。

1Kubelet

负责维护容器的生命周期,即通过控制docker,来创建、更新、销毁容器。

2KubeProxy

负责提供集群内部的服务发现和负载均衡。

3Docker

负责节点上容器的各种操作。

K8S集群环境搭建

(一)集群简介

1集群类型

(1)一主多从

一台Master节点和多台Node节点,搭建简单,但是有单机故障风险,适合用于测试环境。

(2)多主多从

多台Master节点和多台Node节点,搭建麻烦,安全性高,适合用于生产环境。

2安装方式

(1)minikube

一个用于快速搭建单节点kubernetes的工具。

(2)kubeadm(本次使用该方式安装部署)

一个用于快速搭建kubernetes集群的工具。

(3)二进制包

从官网下载每个组件的二进制包,依次去安装,此方式对于理解kubernetes组件更加有效。

(二)集群环境搭建

1主机规划

节点角色

IP地址

系统版本

主机配置

Master

192.168.110.100

CentOS 7.5

2C 2G 50G

Node01

192.168.110.101

CentOS 7.5

2C 2G 50G

Node02

192.168.110.102

CentOS 7.5

2C 2G 50G

2环境初始化

(1)检查操作系统版本

kubeadm方式下安装kubernetes集群要求CentOS版本在7.5或以上

Master\Node节点均要执行如下命令检查操作系统版本

cat /etc/redhat-release

(2)主机名解析

Master\Node节点均要执行

为方便集群节点间的调用,配置主机名解析,企业级推荐使用内部DNS服务器

  • 修改hosts文件

vim /etc/hosts

添加如下内容:

192.168.110.100 master

192.168.110.101 node01

192.168.110.102 node02

  • 修改主机名

vim /etc/hostname

修改实际主机名

(3)时间同步

kubernetes要求集群中的节点时间必须精确一致,这里直接使用chronyd服务从网络同步时间。企业中建议配置内部的时间同步服务器

  • 安装

sudo yum install chrony -y

  • 启动chronyd服务

systemctl start chronyd

systemctl status chronyd

  • 设置chronyd服务开机启动

systemctl enable chronyd

  • chronyd服务启动后几分钟,使用date命令在master/node节点上验证时间是否一致

date

(4)禁用iptables和firewalld服务
  • 关闭firewalld服务

systemctl status firewalld

systemctl stop firewalld

systemctl disable firewalld

  • 关闭iptables服务

systemctl status iptables

systemctl stop iptables

systemctl disable iptables

(5)禁用selinux
  • 查看当前selinux状态

getenforce

  • 修改配置文件关闭selinux

vim /etc/selinux/config

修改如下内容

SELINUX=disabled

  • 重启服务器生效

shutdown -r now

(6)禁用swap分区

启用swap会对系统性能产生负面影响,因此kubernetes要求每个节点都禁用swap编辑分区配置文件,注释swap分区一行

  • 注释分区配置

vim /etc/fstab

注释如下配置

/dev/mapper/centos-swap swap swap defaults 0 0

  • 修改后重启服务器生效

shutdown -r now

(7)修改Linux的内核参数
  • 修改Linux的内核参数,添加网桥过滤和地址转发功能

vim /etc/sysctl.d/kubernetes.conf

添加如下配置:

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

net.ipv4.ip_forward = 1

  • 重新加载配置

sysctl -p

  • 加载网桥过滤模块

modprobe br_netfilter

  • 查看网桥过滤模块是否加载成功

lsmod | grep brnetfilter

(8)配置ipvs功能

IPVS是Linux内核中的一个负载均衡模块,它能够快速、高效地分发网络请求。在Kubernetes中,使用IPVS可以实现高效的负载均衡和服务发现。

在kubernetes中service有两种代理模型,一种是基于iptables,一种是基于ipvs。ipvs性能要高一些,需要手动载入ipvs模块

  • 安装ipset和ipvsadm

yum install ipset -y

yum install ipvsadm -y

  • 添加需要加载的模块写入脚本

cat < /etc/sysconfig/modules/ipvs.modules

!/bin/bash

modprobe -- ipvs modprobe -- ipvsrr modprobe -- ipvswrr modprobe -- ipvssh modprobe -- nfconntrack_ipv4

EOF

  • 为脚本文件添加执行权限

chmod +x /etc/sysconfig/modules/ipvs.modules

  • 执行脚本文件

/bin/bash /etc/sysconfig/modules/ipvs.modules

  • 查看对应的模块是否加载成功

lsmod | grep -e ipvs -e nfconntrack_ipv4

3安装docker

(1)、切换镜像源

cat /etc/yum.repos.d/docker-ce.repo

yum install -y wget

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

(2)、查看当前镜像源中支持的docker版本

yum list docker-ce --showduplicates

(3)、安装特定版本的docker-ce

必须指定--setopt=obsoletes=0,否则yum会自动安装更高版本

yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y

docker --version

(4)、添加一个配置文件

Docker在默认情况下使用的Cgroup Driver为cgroupfs,而kubernetes推荐使用systemd来代替cgoupfs

mkdir /etc/docker

cat < /etc/docker/daemon.json

{

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

"registry-mirrors":["https://kn0t2bca.mirror.aliyuncs.com"]

}

EOF

(5)、启动docker

systemctl status docker

systemctl restart docker

systemctl enable docker

(6)、检查docker状态和版本

docker version

4安装kubernetes组件

由于kubernetes的镜像源在国外,速度慢,这里切换成国内的镜像源

  • 修改镜像

vim /etc/yum.repos.d/kubernetes.repo

添加如下配置:

[kubernetes]

name=Kubernetes

baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x8664 enabled=1 gpgcheck=0 repogpgcheck=0

gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

  • 安装kubeadm、kubelet和kubectl

yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y

  • 配置kubelet的cgroup

vim /etc/sysconfig/kubelet

添加如下配置:

KUBELETCGROUPARGS="--cgroup-driver-systemd"

KUBEPROXYMODE="ipvs"

  • 设置kubelet开机自启

systemctl enable kubelet

5准备集群镜像

在安装kubernetes集群之前,需要提前准备好集群需要的镜像,所需镜像可以通过下面的命令查看

kubeadm config images list

  • 下载镜像

此镜像在kubernetes的仓库中,由于网络原因,无法连接,下面提供了一种替代方案

images=(

kube-apiserver:v1.17.4

kube-controller-manager:v1.17.4

kube-scheduler:v1.17.4

kube-proxy:v1.17.4

pause:3.1

etcd:3.4.3-0

coredns:1.6.5

)

for imageName in ${images[@]};do

docker pull registry.cn-hangzhou.aliyuncs.com/googlecontainers/$imageName docker tag registry.cn-hangzhou.aliyuncs.com/googlecontainers/$imageName k8s.gcr.io/$imageName

docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName

done

  • 下载完成后,查看镜像

docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

k8s.gcr.io/kube-proxy v1.17.4 6dec7cfde1e5 3 years ago 116MB

k8s.gcr.io/kube-apiserver v1.17.4 2e1ba57fe95a 3 years ago 171MB

k8s.gcr.io/kube-controller-manager v1.17.4 7f997fcf3e94 3 years ago 161MB

k8s.gcr.io/kube-scheduler v1.17.4 5db16c1c7aff 3 years ago 94.4MB

k8s.gcr.io/coredns 1.6.5 70f311871ae1 3 years ago 41.6MB

k8s.gcr.io/etcd 3.4.3-0 303ce5db0e90 3 years ago 288MB

k8s.gcr.io/pause 3.1 da86e6ba6ca1 5 years ago 742kB

6集群初始化

下面的操作只需要在master节点执行

  • 创建集群

kubeadm init --kubernetes-version=v1.17.4 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --apiserver-advertise-address=192.168.110.100 

参数解释:

--apiserver-advertise-address:master节点的IP地址

执行初始化命令成功后,会输出如下内容:

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

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.110.100:6443 --token o24fso.8wt7z7y5s7xxymqu \

--discovery-token-ca-cert-hash sha256:cc381215b6d383e7f89eb36114460583cd7ea093a8ef6ea8d02d381be6fd341e

  • 根据上面内容,执行如下命令

创建必要文件

mkdir -p $HOME/.kube

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

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

下面的操作只需要在node节点执行:

  • 将node节点加入集群

kubeadm join 192.168.110.100:6443 --token o24fso.8wt7z7y5s7xxymqu \

--discovery-token-ca-cert-hash sha256:cc381215b6d383e7f89eb36114460583cd7ea093a8ef6ea8d02d381be6fd341e

  • 查看集群状态,此时集群状态为NotReady,这是因为还没有配置网络插件

kubectl get nodes

NAME STATUS ROLES AGE VERSION

master NotReady master 13m v1.17.4

node01 NotReady 37s v1.17.4

node02 NotReady 30s v1.17.4

7安装网络插件

kubernetes支持多种网络插件,比如flannel、calico、canal等,本次选择flannel

下面的操作只需要在master节点执行

(1)、获取flannel的配置文件

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

  • 修改配置文件中quay.io仓库为quay-mirror.qiniu.com

(2)、使用配置文件启动flannel

kubectl apply -f kube-flannel.yaml

  • 稍等片刻,再次查看集群节点状态

kubectl get nodes

  • 若安装kube-flannel后,master、node节点还是NotReady,则执行如下命令逐步排查

排查命令

kubectl -n kube-system get pods -o wide

kubectl logs kube-flannel-ds-amd64-kx4x9 -n kube-system

journalctl -f -u kubelet

看到报错:

[failed to find plugin "flannel" in path [/opt/cni/bin]]

解决方法:

(master、node节点都需要执行)

复制flannel文件到/opt/cni/bin/路径下,并添加执行权限

1、在百度网盘下载flannel文件

百度网盘链接:https://pan.baidu.com/s/1ZoHK2fxsx-U3qBhScgb92w 
提取码:8888

2、把提取到的flannel复制或上传到/opt/cni/bin/

3、增加执行权限

chmod +x /opt/cni/bin/flannel

4、master节点看到节点状态

kubectl get nodes

至此,kubernetes的集群环境搭建完成!

(三)服务部署测试

在kubernetes集群中部署一个Nginx程序,测试集群功能是否正常。

步骤一、部署Nginx

kubectl create deployment nginx --image=nginx:1.14-alpine

步骤二、暴露端口

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

步骤三、查看服务状态

  • 查看pod

kubectl get pods

NAME READY STATUS RESTARTS AGE

nginx-6867cdf567-hz5s6 1/1 Running 0 30s

  • 查看service

kubectl get service

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

kubernetes ClusterIP 10.96.0.1 443/TCP 109m

nginx NodePort 10.107.112.111 80:32127/TCP 7s

  • 最后在电脑浏览器访问Nginx服务,通过master节点IP访问

http://192.168.110.100:32127/

出现 Welcome to nginx!

说明部署成功!

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kubernetes (k8s)是一种用于自动化应用程序部署、扩展和管理的开源容器编排平台。在k8s中,Pod是最小的可调度和可管理的单位,也是应用程序的运行实例。 Pod是一组共享资源的容器集合,它们运行在同一个节点上,并共享相同的网络命名空间和存储卷。一个Pod通常包含一个或多个紧密相关的容器,它们共享相同的生命周期和资源。这些容器之间可以通过本地主机上的localhost进行通信。 Pod的设计理念是将一组密切相关的容器放在同一个Pod中,以便它们能够轻松地共享资源,包括存储和网络。Pod可以在Kubernetes上进行水平扩展,即通过增加Pod的数量来增加应用程序的容量和吞吐量。 Pod是临时的和短暂的,它可以在任何时候被创建、销毁或重新创建。这个设计使得应用程序变得弹性和可伸缩,并支持故障恢复。当Pod被销毁时,Kubernetes会自动重新创建一个新的Pod来替代它,以保持应用程序的可用性。 Pod具有唯一的IP地址,并且可以由其他Pod或外部网络访问。它还可以指定一些元数据(如标签和注释),以方便按需选择和管理Pod。通过使用Pod模板,可以定义Pod的规范,包括容器映像、资源要求和环境变量等。 总之,Pod是Kubernetes中的基本概念,它是一组紧密相关的容器的运行实例。Pod提供了容器之间共享资源的环境,并支持弹性扩展和故障恢复。通过使用Pod,我们可以更高效地管理和部署我们的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值