k8s-Kubernetes--集群部署

文章目录

  • 一、Kubernetes简介与架构
    • 1.Kubernetes简介
    • 2.kubernetes设计架构
    • 3.Kubernetes和Docker的关系、区别
  • 二、Kubernetes集群部署
    • 1.集群环境初始化
    • 2.所有节点安装kubeadm
    • 3.拉取集群所需镜像
    • 4.集群初始化
    • 5.安装flannel网络插件
    • 6.扩容节点
    • 7.设置kubectl命令补齐


一、Kubernetes简介与架构

1.Kubernetes简介

在Docker 作为高级容器引擎快速发展的同时,在Google内部,容器技术已经应用了很多年,Borg系统运行管理着成千上万的容器应用。
Kubernetes项目来源于Borg,可以说是集结了Borg设计思想的精华,并且吸收了Borg系统中的经验和教训。
Kubernetes对计算资源进行了更高层次的抽象,通过将容器进行细致的组合,将最终的应用服务交给用户。
Kubernetes的优势:
(1)隐藏资源管理和错误处理,用户仅需要关注应用的开发。
(2)服务高可用、高可靠。
(3)可将负载运行在由成千上万的机器联合而成的集群中。

2.kubernetes设计架构

Kubernetes集群包含有节点代理kubelet和Master组件(APIs, scheduler, etcd),一切都基于分布式的存储系统。
k8s-Kubernetes--集群部署_第1张图片

Kubernetes主要由以下几个核心组件组成:

  • etcd:保存了整个集群的状态;数据存储引擎;后期可替换为其他存储引擎,仅对应需改变apiserver即可
  • apiserver:提供了资源操作的唯一入口,并提供认证、授权、访问控制、API(Application Programming Interface,应用程序编程接口)注册和发现等机制;其他所有组件通过apiserver连接etcd,进行写入数据等;
  • controller manager:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等
  • scheduler:负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上
  • kubelet:负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理
  • Container runtime:负责镜像管理以及Pod和容器的真正运行(CRI);目前阶段就是docker
  • kube-proxy:负责为Service提供cluster内部的服务发现和负载均衡

除了核心组件,还有一些推荐的Add-ons:

  • kube-dns:负责为整个集群提供DNS服务
  • Ingress Controller:为服务提供外网入口
  • Heapster:提供资源监控
  • Dashboard:提供GUI,界面
  • Federation:提供跨可用区的集群
  • Fluentd-elasticsearch:提供集群日志采集、存储与查询

Kubernetes设计理念和功能其实就是一个类似Linux的分层架构
k8s-Kubernetes--集群部署_第2张图片

  • 核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境
  • 应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解析等)
  • 管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)
  • 接口层:kubectl命令行工具、客户端SDK以及集群联邦
  • 生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴:
    • Kubernetes外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS应用、ChatOps等
    • Kubernetes内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等

3.Kubernetes和Docker的关系、区别

Kubernetes和Docker定义

Kubernetes: 是一个开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。它是一个全面的系统,用于自动化部署、调度和扩展容器化应用,并支持许多容器化工具,如Docker。
Docker:是一个开源的应用容器引擎,开发者可以打包他们的应用及依赖到一个可移植的容器中,可运行在Debian、CentOS、Ubuntu等多操作系统上,也可实现虚拟化。

Kubernetes和Docker区别

Docker是用于构建、分发和运行Docker容器的平台和工具;而Kubernetes不包含用于创建或管理容器镜像的功能,并且它本身并不运行容器。因此两者的主要区别在于Docker在单个节点上运行,而Kubernetes设计为在集群上运行。

Kubernetes和Docker另一个主要区别在于Docker可以在没有Kubernetes的情况下使用,而Kubernetes需要容器运行时才能进行编排。
两者各有各的优势,解决的问题也有所不同

在这里插入图片描述

二、Kubernetes集群部署

官方网址:https://kubernetes.io/
1-23版本:https://v1-23.docs.kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
k8s-Kubernetes--集群部署_第3张图片
k8s-Kubernetes--集群部署_第4张图片

由上图,本次实验我们选择安装1.23版本

k8s-Kubernetes--集群部署_第5张图片

本次实验需准备4台主机:

主机名 ip 角色
server1 192.168.117.11 reg.westos.org,harbor仓库
server2 192.168.117.12 master,k8s集群控制节点
server3 192.168.117.13 node,k8s集群工作节点
server4 192.168.117.14 node,k8s集群工作节点

所有节点禁用selinux和防火墙
所有节点同步时间和/etc/hosts解析
所有节点安装docker-ce
所有节点禁用swap,注意注释掉/etc/fstab文件中的定义

1.集群环境初始化

server1拉起仓库:
[root@server1 harbor]# docker-compose up -d
k8s-Kubernetes--集群部署_第6张图片

由于传文件较多,也可以在server1做免密,本实验未采用免密
k8s-Kubernetes--集群部署_第7张图片
所有k8s集群节点执行以下步骤
禁用swap
[root@server2 ~]# swapoff -a
[root@server2 ~]# vim /etc/fstab
#/dev/mapper/rhel-swap swap swap defaults 0 0
k8s-Kubernetes--集群部署_第8张图片
修改内核参数
[root@server2 sysctl.d]# vim /etc/sysctl.d/docker.conf
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
让内核参数生效:
[root@server2 ~]# sysctl --system
k8s-Kubernetes--集群部署_第9张图片
[root@server2 ~]# vim /etc/yum.repos.d/docker.repo
[docker]
name=docker-ce
baseurl=https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/7/x86_64/stable/
gpgcheck=0

[centos]
name=extras
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/7/extras/x86_64/
gpgcheck=0
k8s-Kubernetes--集群部署_第10张图片
安装docker-ce
k8s-Kubernetes--集群部署_第11张图片

[root@server2 ~]# yum install -y docker-ce
[root@server2 ~]# systemctl enable --now docker
配置默认仓库为:reg.westos.org
[root@server2 ~]# vim /etc/docker/daemon.json
{
“registry-mirrors”: [“https://reg.westos.org”],
“exec-opts”: [“native.cgroupdriver=systemd”],
“log-driver”: “json-file”,
“log-opts”: {
“max-size”: “100m”
},
“storage-driver”: “overlay2”
}

[root@server2 ~]# systemctl restart docker
k8s-Kubernetes--集群部署_第12张图片

所有节点同步docker配置,以及拷贝harbor仓库的证书
证书为之前docker实验时在server1生成(可参考此链接)
[root@server1 ~]# cd /etc/docker/
[root@server1 docker]# ls
certs.d
[root@server1 docker]# scp -r certs.d/ server2:/etc/docker/
[root@server1 docker]# scp -r certs.d/ server3:/etc/docker/
[root@server1 docker]# scp -r certs.d/ server4:/etc/docker/

所有节点添加仓库的地址解析
k8s-Kubernetes--集群部署_第13张图片
确保所有k8s节点可以从私有仓库下载镜像
注:可以在仓库页面查看日志,确保所有节点可以拉取
[root@server2 docker]# docker pull nginx
[root@server3 docker]# docker pull nginx
[root@server4 docker]# docker pull nginx

2.所有节点安装kubeadm

k8s-Kubernetes--集群部署_第14张图片

[root@server2 yum.repos.d]# vim /etc/yum.repos.d/k8s.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.tuna.tsinghua.edu.cn/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=0
k8s-Kubernetes--集群部署_第15张图片
[root@server2 ~]# yum install -y kubelet-1.23.17-0 kubeadm-1.23.17-0 kubectl-1.23.17-0

[root@server2 ~]# systemctl enable --now kubelet
kubelet是一个循环程序,会主动探测集群的状态,一直会尝试重启
若安装安装很多软件,建议建立本地yum源
注:下图为列出软件版本
[root@server2 ~]# yum list --showduplicates kubeadm
在这里插入图片描述

3.拉取集群所需镜像

k8s-Kubernetes--集群部署_第16张图片

[root@server2 ~]# kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers
注:指定镜像的位置是阿里云:registry.aliyuncs.com
k8s-Kubernetes--集群部署_第17张图片
登录仓库
[root@server2 ~]# docker login reg.westos.org
Username: admin
Password:
先在harbor仓库上新建一个项目(需设置为公开):
k8s-Kubernetes--集群部署_第18张图片
上传镜像:
1.给拉取的镜像加标签(用变量的方式进行替换)
[root@server2 ~]# docker images | grep google_containers | awk ‘{print $1":"$2}’ | awk -F/ ‘{system(“docker tag “$0” reg.westos.org/k8s/”$3"")}’
2.上传
[root@server2 ~]# docker images |grep k8s | awk ‘{system(“docker push “$1”:”$2"")}’
k8s-Kubernetes--集群部署_第19张图片

4.集群初始化

[root@server2 ~]# kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository reg.westos.org/k8s --kubernetes-version v1.23.17
注:–pod-network-cidr=10.244.0.0/16是一个比较常用的网络段
–kubernetes-version指定k8s安装版本
k8s-Kubernetes--集群部署_第20张图片
根据上图,进行下一步设置环境变量:root执行export KUBECONFIG=/etc/kubernetes/admin.conf即可
普通用户执行按照上图的另一条要求执行(箭头所指位置)
设置环境变量
[root@server2 ~]# export KUBECONFIG=/etc/kubernetes/admin.conf
注:/etc/kubernetes/admin.conf为证书,用来连接APIserver的证书
注意:没有设置变量会有以下报错
在这里插入图片描述
写入环境变量文件,确保重启后依然生效
[root@server2 ~]# vim .bash_profile
export KUBECONFIG=/etc/kubernetes/admin.conf
k8s-Kubernetes--集群部署_第21张图片
查看集群状态
[root@server2 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s2 NotReady control-plane,master 74s v1.23.17
当前节点还没有就绪,是因为没有安装网络插件,pod还没运行

[root@server2 ~]# kubectl get pod -A                                    ##和docker ps -a 作用一致
NAMESPACE     NAME                           READY   STATUS    RESTARTS   AGE
kube-system   coredns-7b56f6bc55-b495q       0/1     Pending   0          79s
kube-system   coredns-7b56f6bc55-ch2ts       0/1     Pending   0          79s
kube-system   etcd-k8s2                      1/1     Running   0          92s
kube-system   kube-apiserver-k8s2            1/1     Running   0          92s
kube-system   kube-controller-manager-k8s2   1/1     Running   0          92s
kube-system   kube-proxy-7ckfn               1/1     Running   0          79s
kube-system   kube-scheduler-k8s2            1/1     Running   0          92s

5.安装flannel网络插件

Flannel简介
Flannel官网:https://github.com/coreos/flannel
Flannel是由CoreOS开源的针对k8s的网络服务,其目的是为解决k8s集群中各主机上Pod之间的通信问题,其借助etcd维护网络IP地址分配,并为每个Node节点分配一个不同的IP地址段。
Flannel在每个节点运行一个名为flanneld的二进制代理程序,它负责从预留的网络中按照指定或者默认的掩码长度为当前节点申请分配一个子网,并将网络配置、已分配的子网和辅助数据(比如主机的公网IP等)存储在Kubernetes API或独立的etcd中。Flannel通过不同的后端来实现跨节点Pod间的通信

所有node节点都要去下载flannel网络插件,所以将镜像上传至私有仓库,并将访问地址修改为我们建立的私有仓库即可
下载flannel网络插件
[root@server2 ~]# yum install -y wget
[root@server2 ~]# wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
修改镜像位置:从官方仓库改为默认找私有仓库
[root@server2 ~]# vim kube-flannel.yml
k8s-Kubernetes--集群部署_第22张图片
在这里插入图片描述
k8s-Kubernetes--集群部署_第23张图片
新建项目仓库(需设置为公开)
k8s-Kubernetes--集群部署_第24张图片
下载镜像
[root@server1 docker]# docker pull docker.io/flannel/flannel:v0.21.2
[root@server1 docker]# docker pull docker.io/flannel/flannel-cni-plugin:v1.1.2
上传镜像:($0表示取出来的部分)
[root@server1 docker]# docker images |grep flannel | awk ‘{print $1":"$2}’ | awk ‘{system(“docker tag “$0” reg.westos.org/”$0"")}’

[root@server1 docker]# docker push reg.westos.org/flannel/flannel:v0.21.2
[root@server1 docker]# docker push reg.westos.org/flannel/flannel-cni-plugin:v1.1.2
确保镜像上传成功
k8s-Kubernetes--集群部署_第25张图片
部署网络插件
[root@server2 ~]# kubectl apply -f kube-flannel.yml

namespace/kube-flannel created
serviceaccount/flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created

[root@server2 ~]# kubectl  -n kube-flannel get pod
NAME                    READY   STATUS    RESTARTS   AGE
kube-flannel-ds-6gnh4   1/1     Running   0          11s

[root@server2 ~]# kubectl get node
NAME   STATUS   ROLES                  AGE   VERSION
k8s2   Ready    control-plane,master   14m   v1.23.17

[root@server2 ~]# kubectl get pod -A
NAMESPACE      NAME                           READY   STATUS    RESTARTS   AGE
kube-flannel   kube-flannel-ds-6gnh4          1/1     Running   0          20s
kube-system    coredns-7b56f6bc55-b495q       1/1     Running   0          14m
kube-system    coredns-7b56f6bc55-ch2ts       1/1     Running   0          14m
kube-system    etcd-k8s2                      1/1     Running   0          14m
kube-system    kube-apiserver-k8s2            1/1     Running   0          14m
kube-system    kube-controller-manager-k8s2   1/1     Running   0          14m
kube-system    kube-proxy-7ckfn               1/1     Running   0          14m
kube-system    kube-scheduler-k8s2            1/1     Running   0          14m

以上所有的信息已经写到了etcd中,当有节点加进来的时候,会从etcd中获取集群状态

6.扩容节点

以下两条命令为3.集群初始化时在server2生成,复制在server3、server4直接使用即可;(–token有效期为24小时)

[root@server3 ~]# kubeadm join 192.168.56.12:6443 --token u9a137.tll3mwnlqgc74gll \
>         --discovery-token-ca-cert-hash sha256:01198c9ecacf6d15068debb4cd4fddf8ac0fa1dba65c3b049c5dc1761c355e02

[root@server4 ~]# kubeadm join 192.168.56.12:6443 --token u9a137.tll3mwnlqgc74gll \
>         --discovery-token-ca-cert-hash sha256:01198c9ecacf6d15068debb4cd4fddf8ac0fa1dba65c3b049c5dc1761c355e02

[root@server2 ~]# kubectl get node
NAME   STATUS   ROLES                  AGE   VERSION
k8s2   Ready    control-plane,master   16m   v1.23.17
k8s3   Ready                     52s   v1.23.17
k8s4   Ready                     46s   v1.23.17

k8s-Kubernetes--集群部署_第26张图片

7.设置kubectl命令补齐

[root@server2 ~]# yum install -y bash-completion
[root@server2 ~]# echo “source <(kubectl completion bash)” >> ~/.bashrc
[root@server2 ~]# source ~/.bashrc
k8s-Kubernetes--集群部署_第27张图片
kubectl命令指南
https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands


你可能感兴趣的:(k8s,kubernetes,docker,容器)