带你深入学习k8s--(一)Kubernetes集群部署
创始人
2025-05-30 12:10:56
0

目录

前言:

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

相关内容

热门资讯

国庆节放假通知 国庆节放假通知(精选16篇)  在这特殊的日子里,送一份最真诚的祝福给你,愿轻松相伴左右,愿快乐如影...
公司宿舍管理制度 公司宿舍管理制度  公司宿舍管理制度(通用30篇)  随着社会一步步向前发展,需要使用制度的场合越来...
健康管理制度 健康管理制度范本(精选4篇)  在发展不断提速的社会中,我们每个人都可能会接触到制度,制度是要求成员...
LeetCode-1012-至... 1、递归+动态规划 我们可以使用数组dp[i]dp[i]dp[i]来记录到字符串的第iii位...
美国加息和中国降准的区别 目录 美国加息和中国降准的区别 央行降准,全称为中央银行调低法定存款准备率。
Spark Streaming... Spark Streaming是构建在Spark上的实时计算框架,它扩展了Spark处...
员工薪酬管理制度 员工薪酬管理制度范本  在日常生活和工作中,接触到制度的地方越来越多,制度一般指要求大家共同遵守的办...
下载和阅读Android源码 目录一、如何下载AOSP1.全量下载2.单个下载目录结构二、如何阅读AOSP1.要阅读哪些源码2.阅...
公司中秋放假通知 公司中秋放假通知范文(精选14篇)  在现在的社会生活中,很多地方都会使用到通知,通知大多属于知照性...
企业严正声明 企业严正声明范文  如何写企业严正声明?下面是小编给大家整理收集的企业严正声明范文,供大家阅读参考。...
书法作品落款的一般格式 书法作品落款的一般格式书法作品落款的一般落款位置没有固定格式,也无绝对的位置,它是与正文互为关联的。...
搜索系统(一) 爬虫 索引建立 正排:由key查找实体,拿url查找web page&#...
吲哚花菁素Alkyne 780... 一、IR780 alkyne产品描述:IR-780染料在没有tumour靶向配体修饰的...
公司消防安全管理制度 公司消防安全管理制度1、目的对消防安全进行控制管理,保障企业的健康、稳定发展。2、适用范围适用于本公...
锅炉工岗位职责 锅炉工岗位职责  岗位职责确定职责  1.根据工作任务的需要确立工作岗位名称及其数量;  2.根据岗...
保安公司保密制度 保安公司保密制度  在社会一步步向前发展的今天,制度的使用频率呈上升趋势,制度是指一定的规格或法令礼...
幼儿园餐具消毒卫生制度 幼儿园餐具消毒卫生制度幼儿园餐具消毒卫生制度1、幼儿餐后餐具立即清洗消毒,做到使用一次、清洗消毒一次...
VS2017+Qt5.12环境... VS2017+Qt5.12环境搭建在学习一门新技术时,最令人头疼的莫过于布置环...
亚马逊的这些“坑”,龙哥不允许... 随着口罩的放开,很多人都把目光投向了跨境电商这个领域。讲到跨境电商,肯定...