本文概览

一、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!

说明部署成功!

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐