带你深入学习k8s--(一)Kubernetes集群部署
创始人
2025-05-30 11:25:01

目录

前言:

一、Kubernetes简介与架构

1. Kubernetes简介

2. kubernetes设计架构

二、实验环境搭建

1、集群环境初始化

2、所有集群节点安装kubeadm

3、拉取集群所需镜像

3、集群初始化

4、安装flannel网络插件

5、扩容节点

6、设置kubectl命令补齐


前言:

官网:Kubernetes 文档 | Kubernetes

Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。

一、Kubernetes简介与架构

1. Kubernetes简介

kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。

Kubernetes一个核心的特点就是能够自主的管理容器来保证云平台中的容器按照用户的期望状态运行着(比如用户想让apache一直运行,用户不需要关心怎么去做,Kubernetes会自动去监控,然后去重启,新建,总之,让apache一直提供服务),管理员可以加载一个微型服务,让规划器来找到合适的位置,同时,Kubernetes也系统提升工具以及人性化方面,让用户能够方便的部署自己的应用(就像canary deployments)。


Kubernetes的好处:
隐藏资源管理和错误处理,用户仅需要关注应用的开发。
服务高可用、高可靠。
可将负载运行在由成千上万的机器联合而成的集群中。

2. kubernetes设计架构

Kubernetes集群包含有节点代理kubelet和Master组件(APIs, scheduler, etc),一切都基于分布式的存储系统。

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

  • etcd保存了整个集群的状态;
  • apiserver提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;
  • controller manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
  • scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;
  • kubelet负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;
  • Container runtime负责镜像管理以及Pod和容器的真正运行(CRI);
  • kube-proxy负责为Service提供cluster内部的服务发现和负载均衡;

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

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

Kubernetes设计理念和功能其实就是一个类似Linux的分层架构

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

二、实验环境搭建

官网:安装 kubeadm | Kubernetes

主机名

ip

角色

k8s1

192.168.56.11

reg.westos.org,harbor仓库

k8s2

192.168.56.12

master,k8s集群控制节点

k8s3

192.168.56.13

node,k8s集群工作节点

k8s4

192.168.56.14

node,k8s集群工作节点

所有节点禁用selinux和防火墙

所有节点同步时间和解析

所有节点安装docker-ce

所有节点禁用swap,注意注释掉/etc/fstab文件中的定义

1、集群环境初始化

k8s1节点作为harbor仓库,请按一下步骤部署

[root@k8s1 ~]# cd /etc/yum.repos.d/

[root@k8s1 yum.repos.d]# vim docker.repo

[docker]

name=docker-ce

baseurl=https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/7/x86_64/stable/

gpgcheck=0

[update]

name=centos

baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/7/extras/x86_64/

gpgcheck=0

安装docker-ce

[root@k8s1 yum.repos.d]# yum install -y docker-ce

启动服务

[root@k8s1 ~]# systemctl enable --now docker

[root@k8s1 ~]# docker info

f7593aa4f8eca9f71e34d706dd265f8b.png

激活内核选项

[root@k8s1 ~]# 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@k8s1 ~]# sysctl --system

[root@k8s1 ~]# systemctl restart docker

升级软件包

[root@k8s1 ~]# yum install -y openssl11-1.1.1k-4.el7.x86_64.rpm openssl11-libs-1.1.1k-4.el7.x86_64.rpm

添加域名解析

[root@k8s1 ~]# vim /etc/hosts

...

192.168.56.11 k8s1 reg.westos.org

[root@k8s1 ~]# mkdir certs

[root@k8s1 ~]# openssl11 req -newkey rsa:4096 -nodes -sha256 -keyout certs/westos.org.key -addext "subjectAltName = DNS:reg.westos.org" -x509 -days 365 -out certs/westos.org.crt

域名保持一致

3afe7dda73a52ec6d0d727bbc758a7a7.png

[root@k8s1 ~]# docker run -d -p 443:443 --restart=always --name registry -v /opt/registry:/var/lib/registry -v /root/certs:/certs -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/westos.org.crt -e REGISTRY_HTTP_TLS_KEY=/certs/westos.org.key registry

部署客户端证书,不然会报错

[root@k8s1 ~]# docker tag nginx:latest reg.westos.org/nginx:latest

[root@k8s1 ~]# docker push reg.westos.org/nginx:latest The push refers to repository [reg.westos.org/nginx]

Get "https://reg.westos.org/v2/": x509: certificate signed by unknown authority

[root@k8s1 ~]# mkdir -p /etc/docker/certs.d/reg.westos.org/

[root@k8s1 ~]# cp /root/certs/westos.org.crt /etc/docker/certs.d/reg.westos.org/ca.crt

验证

[root@k8s1 ~]# docker push reg.westos.org/nginx:latest

[root@k8s1 reg.westos.org]# curl -k https://reg.westos.org/v2/_catalog

{"repositories":["nginx"]}

仓库认证

[root@k8s1 ~]# yum install -y httpd-tools

[root@k8s1 ~]# mkdir auth

[root@k8s1 ~]# htpasswd -Bc auth/htpasswd admin

New password:

Re-type new password:

Adding password for user admin

第二次添加不要加“-c”选项,不然会覆盖

[root@k8s1 ~]# htpasswd -B auth/htpasswd wxh

New password:

Re-type new password:

Adding password for user wxh

[root@k8s1 ~]# cat auth/htpasswd

admin:$2y$05$Wm2LHttPY5a6i2KMG0fShe92d/PjnaBbGitiClcE3wqHmwO8dIDFm

wxh:$2y$05$9rE9CXyZ1fdcMammhh7f6.soDHgKdSsi0DXBgkRW5sKRw5sEJo1lK

删除registry,重建

[root@k8s1 ~]# docker rm -f registry

[root@k8s1 ~]# docker run -d -p 443:443 --restart=always --name registry -v /opt/registry:/var/lib/registry -v /root/certs:/certs -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/westos.org.crt -e REGISTRY_HTTP_TLS_KEY=/certs/westos.org.key -v /root/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry

登录仓库,不然无法上传下载

[root@k8s1 ~]# docker login reg.westos.org

Username: admin

Password:

WARNING! Your password will be stored unencrypted in /root/.docker/config.json.

Configure a credential helper to remove this warning. See

https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

[root@k8s1 ~]# cat .docker/config.json

验证

[root@k8s1 ~]# docker tag busybox:latest reg.westos.org/busybox:latest

[root@k8s1 ~]# docker push reg.westos.org/busybox:latest

[root@k8s1 ~]# curl -k https://reg.westos.org/v2/_catalog -u admin:westos

{"repositories":["busybox","nginx"]}

登出

[root@k8s1 ~]# docker logout reg.westos.org

[root@k8s1~]# tar zxf harbor-offline-installer-v2.5.0.tgz

[root@k8s1~]# cd harbor/

[root@k8s1harbor]# cp harbor.yml.tmpl harbor.yml

[root@k8s1harbor]# vim harbor.yml

hostname: reg.westos.org

http:

# port for http, default is 80. If https enabled, this port will redirect to https port

port: 80

https:

# https port for harbor, default is 443

port: 443

# The path of cert and key files for nginx

certificate: /data/certs/westos.org.crt

private_key: /data/certs/westos.org.key

harbor_admin_password: westos

拷贝证书

[root@k8s1~ ]# mkdir /data

[root@k8s1~ ]# cp -r certs /data

部署docker-compose

[root@k8s1~]# mv docker-compose-linux-x86_64-v2.5.0 /usr/local/bin/docker-compose

[root@k8s1~]# chmod +x /usr/local/bin/docker-compose

部署harbor

[root@k8s1harbor]# ./install.sh

使用浏览器登录仓库 用户名:admin 密码是上面配置文件设置的westos

https://192.168.56.11

上传镜像,首先需要执行

docker login reg.westos.org

[root@k8s1~]# docker tag busybox:latest reg.westos.org/library/busybox:latest

[root@k8s1~]# docker tag nginx:latest reg.westos.org/library/nginx:latest

[root@k8s1~]# docker push reg.westos.org/library/nginx:latest

[root@k8s1 ~]# docker push reg.westos.org/library/busybox:latest

fd436c87c18cdc3ec296476224ed234f.png

下面是k8s集群配置

所有k8s集群节点执行以下步骤

[root@k8s2 ~]# swapoff -a

[root@k8s2 ~]# vim /etc/fstab

#

# /etc/fstab

# Created by anaconda on Sun Feb 19 17:38:40 2023

#

# Accessible filesystems, by reference, are maintained under '/dev/disk'

# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

#

/dev/mapper/rhel-root / xfs defaults 0 0

UUID=ddb06c77-c9da-4e92-afd7-53cd76e6a94a /boot xfs defaults 0 0

#/dev/mapper/rhel-swap swap swap defaults 0 0

/dev/cdrom /media iso9660 defaults 0 0

修改内核参数

[root@k8s2 ~]# cd /etc/sysctl.d/

[root@k8s2 sysctl.d]# vim docker.conf

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

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

net.ipv4.ip_forward=1

[root@k8s2 ~]# sysctl --system

[root@k8s2 yum.repos.d]# vim docker.repo

[docker]

name=docker-ce

baseurl=Index of /docker-ce/linux/centos/7/x86_64/stable/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

gpgcheck=0

[centos]

name=extras

baseurl=Index of /centos/7/extras/x86_64/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

gpgcheck=0

[root@k8s2 ~]# yum install -y docker-ce

[root@k8s2 ~]# systemctl enable --now docker

[root@k8s2 ~]# 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@k8s2 ~]# systemctl restart docker

所有节点同步docker配置,以及拷贝harbor仓库的证书

[root@k8s1 ~]# cd /etc/docker/

[root@k8s1 docker]# ls

certs.d

[root@k8s1 docker]# scp -r certs.d/ k8s2:/etc/docker/

确保所有k8s节点可以从私有仓库下载镜像

[root@k8s2 docker]# docker pull nginx

2、所有集群节点安装kubeadm

[root@k8s2 yum.repos.d]# vim k8s.repo

[kubernetes]

name=Kubernetes

baseurl=Index of /kubernetes/yum/repos/kubernetes-el7-x86_64/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

gpgcheck=0

[root@k8s2 ~]# yum install -y kubelet-1.23.17-0 kubeadm-1.23.17-0 kubectl-1.23.17-0

[root@k8s2 ~]# systemctl enable --now kubelet

3、拉取集群所需镜像

[root@k8s2 ~]# kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers

登录仓库

[root@k8s2 ~]# docker login reg.westos.org

Username: admin

Password:

先在harbor仓库上新建一个项目

上传镜像

[root@k8s2 ~]# docker images |grep google_containers | awk '{print $1":"$2}' | awk -F/ '{system("docker tag "$0" reg.westos.org/k8s/"$3"")}'

[root@k8s2 ~]# docker images |grep k8s | awk '{system("docker push "$1":"$2"")}'

3、集群初始化

[root@k8s2 ~]# kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository reg.westos.org/k8s --kubernetes-version v1.23.17

设置环境变量

[root@k8s2 ~]# export KUBECONFIG=/etc/kubernetes/admin.conf

注意没有设置变量会有以下报错

写入环境变量文件,确保重启后依然生效

[root@k8s2 ~]# vim .bash_profile

# .bash_profile

# Get the aliases and functions

if [ -f ~/.bashrc ]; then

. ~/.bashrc

fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH

export KUBECONFIG=/etc/kubernetes/admin.conf

查看集群状态

[root@k8s2 ~]# kubectl get node

NAME STATUS ROLES AGE VERSION

k8s2 NotReady control-plane,master 74s v1.23.17

当前节点还没有就绪,是因为没有安装网路插件,pod还没运行

[root@k8s2 ~]# kubectl get pod -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

4、安装flannel网络插件

下载flannel网络插件

[root@k8s2 ~]# yum install -y wget

[root@k8s2 ~]# wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

修改镜像位置

[root@k8s2 ~]# vim kube-flannel.yml

a5e8e77d03355c5109154be817d8320c.png 

 

新建项目仓库

下载镜像

[root@k8s1 docker]# docker pull docker.io/flannel/flannel:v0.21.2

[root@k8s1 docker]# docker pull docker.io/flannel/flannel-cni-plugin:v1.1.2

上传镜像

[root@k8s1 docker]# docker images |grep flannel | awk '{print $1":"$2}' | awk '{system("docker tag "$0" reg.westos.org/"$0"")}'

[root@k8s1 docker]# docker push reg.westos.org/flannel/flannel:v0.21.2

[root@k8s1 docker]# docker push reg.westos.org/flannel/flannel-cni-plugin:v1.1.2

确保镜像上传成功

eb8943e2aece68c75419bf9c21e6b317.png

部署网络插件

[root@k8s2 ~]# 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@k8s2 ~]# kubectl -n kube-flannel get pod

NAME READY STATUS RESTARTS AGE

kube-flannel-ds-6gnh4 1/1 Running 0 11s

[root@k8s2 ~]# kubectl get node

NAME STATUS ROLES AGE VERSION

k8s2 Ready control-plane,master 14m v1.23.17

[root@k8s2 ~]# 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

5、扩容节点

[root@k8s3 ~]# kubeadm join 192.168.56.12:6443 --token u9a137.tll3mwnlqgc74gll \

> --discovery-token-ca-cert-hash sha256:01198c9ecacf6d15068debb4cd4fddf8ac0fa1dba65c3b049c5dc1761c355e02

[root@k8s4 ~]# kubeadm join 192.168.56.12:6443 --token u9a137.tll3mwnlqgc74gll \

> --discovery-token-ca-cert-hash sha256:01198c9ecacf6d15068debb4cd4fddf8ac0fa1dba65c3b049c5dc1761c355e02

[root@k8s2 ~]# 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

6、设置kubectl命令补齐

[root@k8s2 ~]# yum install -y bash-completion

[root@k8s2 ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc

[root@k8s2 ~]# source ~/.bashrc

至此集群环境部署完毕,下章节正式开始k8s之旅!

相关内容

热门资讯

【实验报告】实验一 图像的... 实验目的熟悉Matlab图像运算的基础——矩阵运算;熟悉图像矩阵的显示方法࿰...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
大模型落地比趋势更重要,NLP... 全球很多人都开始相信,以ChatGPT为代表的大模型,将带来一场NLP领...
Linux学习之端口、网络协议... 端口:设备与外界通讯交流的出口 网络协议:   网络协议是指计算机通信网...
kuernetes 资源对象分... 文章目录1. pod 状态1.1 容器启动错误类型1.2 ImagePullBackOff 错误1....
STM32实战项目-数码管 程序实现功能: 1、上电后,数码管间隔50ms计数; 2、...
TM1638和TM1639差异... TM1638和TM1639差异说明 ✨本文不涉及具体的单片机代码驱动内容,值针对芯...
Qt+MySql开发笔记:Qt... 若该文为原创文章,转载请注明原文出处 本文章博客地址:https://h...
Java内存模型中的happe... 第29讲 | Java内存模型中的happen-before是什么? Java 语言...
《扬帆优配》算力概念股大爆发,... 3月22日,9股封单金额超亿元,工业富联、鸿博股份、鹏鼎控股分别为3.0...
CF1763D Valid B... CF1763D Valid Bitonic Permutations 题目大意 拱形排列࿰...
SQL语法 DDL、DML、D... 文章目录1 SQL通用语法2 SQL分类3 DDL 数据定义语言3.1 数据库操作3.2 表操作3....
文心一言 VS ChatGPT... 3月16号,百度正式发布了『文心一言』,这是国内公司第一次发布类Chat...
CentOS8提高篇5:磁盘分...        首先需要在虚拟机中模拟添加一块新的硬盘设备,然后进行分区、格式化、挂载等...
Linux防火墙——SNAT、... 目录 NAT 一、SNAT策略及作用 1、概述 SNAT应用环境 SNAT原理 SNAT转换前提条...
部署+使用集群的算力跑CPU密... 我先在开头做一个总结,表达我最终要做的事情和最终环境是如何的,然后我会一...
Uploadifive 批量文... Uploadifive 批量文件上传_uploadifive 多个上传按钮_asing1elife的...
C++入门语法基础 文章目录:1. 什么是C++2. 命名空间2.1 域的概念2.2 命名...
2023年全国DAMA-CDG... DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义...
php实现助记词转TRX,ET... TRX助记词转地址网上都是Java,js或其他语言开发的示例,一个简单的...
【分割数据集操作集锦】毕设记录 1. 按要求将CSV文件转成json文件 有时候一些网络模型的源码会有data.json这样的文件里...
Postman接口测试之断言 如果你看文字部分还是不太理解的话,可以看看这个视频,详细介绍postma...
前端学习第三阶段-第4章 jQ... 4-1 jQuery介绍及常用API导读 01-jQuery入门导读 02-JavaScri...
4、linux初级——Linu... 目录 一、用CRT连接开发板 1、安装CRT调试工具 2、连接开发板 3、开机后ctrl+c...
Urban Radiance ... Urban Radiance Fields:城市辐射场 摘要:这项工作的目标是根据扫描...
天干地支(Java) 题目描述 古代中国使用天干地支来记录当前的年份。 天干一共有十个,分别为:...
SpringBoot雪花ID长... Long类型精度丢失 最近项目中使用雪花ID作为主键,雪花ID是19位Long类型数...
对JSP文件的理解 JSP是java程序。(JSP本质还是一个Servlet) JSP是&#...
【03173】2021年4月高... 一、单向填空题1、大量应用软件开发工具,开始于A、20世纪70年代B、20世纪 80年...
LeetCode5.最长回文子... 目录题目链接题目分析解题思路暴力中心向两边拓展搜索 题目链接 链接 题目分析 简单来说࿰...