容器引领者:Kubernetes集群部署

一.Kubernetes简介与部署

1.1 k8s的部署演变

传统部署:互联网早期,会直接将应用程序部署在物理机上

  • 优点:简单,不需要其它技术的参与

  • 缺点:不能为应用程序定义资源使用边界,很难合理地分配计算资源,而且程序之间容易产生影响

虚拟化部署:可以在一台物理机上运行多个虚拟机,每个虚拟机都是独立的一个环境

  • 优点:程序环境不会相互产生影响,提供了一定程度的安全性

  • 缺点:增加了操作系统,浪费了部分资源

容器化部署:与虚拟化类似,但是共享了操作系统

容器化部署方式给带来很多的便利,但是也会出现一些问题,比如说:

  • 一个容器故障停机了,怎么样让另外一个容器立刻启动去替补停机的容器

  • 当并发访问量变大的时候,怎么样做到横向扩展容器数量

1.2 容器编排应用

为了解决这些容器编排问题,就产生了一些容器编排的软件:

  • Swarm:Docker自己的容器编排工具

  • Mesos:Apache的一个资源统一管控的工具,需要和Marathon结合使用

  • Kubernetes:Google开源的的容器编排工具

1.3 Kubernetes简介

  • 在Docker 作为高级容器引擎快速发展的同时,在Google内部,容器技术已经应用了很多年

  • Borg系统运行管理着成千上万的容器应用。

  • Kubernetes项目来源于Borg,可以说是集结了Borg设计思想的精华,并且吸收了Borg系统中的经验和教训。

  • Kubernetes对计算资源进行了更高层次的抽象,通过将容器进行细致的组合,将最终的应用服务交给用户。

  • kubernetes的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。目的是实现资源管理的自动化,主要提供了如下的主要功能:

  • 自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速启动新的容器

  • 弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整

  • 服务发现:服务可以通过自动发现的形式找到它所依赖的服务

  • 负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡

  • 版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本

  • 存储编排:可以根据容器自身的需求自动创建存储卷

二. k8s的部署

2.1 k8s的管理方式

centainerd:默认情况下,K8S在创建集群时使用的方式

docker:Docker使用的普记录最高,虽然K8S在1.24版本后已经费力了kubelet对docker的支持,但时可以借助cri-docker方式来实现集群创建

cri-o:CRI-O的方式是Kubernetes创建容器最直接的一种方式,在创建集群的时候,需要借助于cri-o插件的方式来实现Kubernetes集群的创建。

docker 和cri-o 这两种方式要对kubelet程序的启动参数进行设置

2.2 环境部署

主机名ip角色
docker-hub172.25.254.250harbor仓库
k8s-master172.25.254.100master,k8s集群控制节点

k8s-node1

172.25.254.10

worker,k8s工作节点

k8s-node2172.25.254.20worker,k8s工作节点

2.2.1 配置docker-harbor仓库

配置docker

[root@docker-hub ~]# cd /etc/yum.repos.d/
[root@docker-hub yum.repos.d]# ls
redhat.repo  rhel9.repo
[root@docker-hub yum.repos.d]# vim docker-ce.repo
[docker]
name=docker
baseurl=https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/rhel/9/x86_64/stable/
gpgcheck=0
[root@docker-hub yum.repos.d]# dnf search docker
[root@docker-hub yum.repos.d]# yum install --allowerasing docker-ce.x86_64

[root@docker-hub ~]# docker load -i registry.tag.gz
ce7f800efff9: Loading layer [==================================================>]  7.644MB/7.644MB
30609d4f10dd: Loading layer [==================================================>]  792.6kB/792.6kB
3b6a51496c9d: Loading layer [==================================================>]  17.55MB/17.55MB
e704e9e3e9dc: Loading layer [==================================================>]  3.584kB/3.584kB
f019f591461d: Loading layer [==================================================>]  2.048kB/2.048kB
Loaded image: registry:latest
[root@docker-hub ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
registry     latest    cfb4d9904335   12 months ago   25.4MB

加密

[root@docker-hub ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.254.250      docker-hub.timinglee.org  reg.timinglee.org
[root@docker-hub ~]# mkdir certs
[root@docker-hub ~]# vim /etc/hosts
[root@docker-hub ~]# openssl req -newkey rsa:4096 -nodes -sha256 \
> -keyout certs/timinglee.org.key \
> -addext "subjectAltName = DNS:reg.timinglee.org" \
> -x509 -days 365 -out certs/timinglee.org.crt
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Shanxi
Locality Name (eg, city) [Default City]:XI'an
Organization Name (eg, company) [Default Company Ltd]:docker
Organizational Unit Name (eg, section) []:registry
Common Name (eg, your name or your server's hostname) []:reg.timinglee.org
Email Address []:admin@timinglee.org
[root@docker-hub ~]# ls certs/
timinglee.org.crt  timinglee.org.key

部署harbor


[root@docker-hub ~]# ls
公共  视频  文档  音乐  anaconda-ks.cfg  ens160.nmconnectio   eth0.nmconnection
模板  图片  下载  桌面  certs            ens160.nmconnection  harbor-offline-installer-v2.5.4.tgz
[root@docker-hub ~]# tar zxf harbor-offline-installer-v2.5.4.tgz
[root@docker-hub ~]# ls
公共  视频  文档  音乐  anaconda-ks.cfg  ens160.nmconnectio   eth0.nmconnection  harbor-offline-installer-v2.5.4.tgz
模板  图片  下载  桌面  certs            ens160.nmconnection  harbor
[root@docker-hub ~]# cd harbor/
[root@docker-hub harbor]# cp harbor.yml.tmpl harbor.yml
[root@docker-hub harbor]# vim harbor.yml
[root@docker-hub harbor]#  ./install.sh --with-chartmuseum
[root@docker-hub harbor]# docker compose up -d
WARN[0000] /root/harbor/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion
[+] Running 12/12
 ✔ Network harbor_harbor              Created                                                                                                                  0.1s
 ✔ Network harbor_harbor-chartmuseum  Created                                                                                                                  

上传镜像要建立项目

2.2.2 配置master主机

[root@k8s-master ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.254.100      k8s-master.timinglee.org
172.25.254.10       k8s-node1.timinglee.org
172.25.254.20       k8s-node2.timinglee.org
172.25.254.250      docker-hub.timinglee.org
[root@k8s-master ~]# scp /etc/hosts root@172.25.254.10:/etc/hosts
[root@k8s-master ~]# scp /etc/hosts root@172.25.254.20:/etc/hosts
[root@k8s-master ~]# yum list httpd
正在更新 Subscription Management 软件仓库。
无法读取客户身份

本系统尚未在权利服务器中注册。可使用 subscription-manager 进行注册。

AppStream                                                                                                                           170 MB/s | 6.1 MB     00:00
BaseOS                                                                                                                               62 MB/s | 1.7 MB     00:00
可安装的软件包
httpd.x86_64                                                                 2.4.53-7.el9                                                                  AppStream

安装docker  从阿里云下载
[root@k8s-master ~]# cd /etc/yum.repos.d/
[root@k8s-master yum.repos.d]# cat docker.repo
[docker-ce]
name=docker-ce
gpgcheck=0
baseurl=https://mirrors.aliyun.com/docker-ce/linux/rhel/9/x86_64/stable
[root@k8s-master yum.repos.d]# dnf makecache
[root@k8s-master yum.repos.d]# dnf install docker-ce -y
[root@k8s-master yum.repos.d]# dnf install --allowerasing docker-ce -y

[root@k8s-master docker]# for i in 10 20 ; do scp /etc/docker/* root@172.25.254.$i:/etc/docker; done
[root@k8s-master docker]# for i in 10 20 ; do scp /etc/modules-load.d/docker_mod.conf  root@172.25.254.$i:/etc/modules-load.d/docker_mod.conf; done
[root@k8s-master docker]# for i in 10 20 ; do scp /etc/sysctl.d/docker.conf  root@172.25.254.$i:/etc/sysctl.d/docker.conf; done

两台工作机

[root@k8s-node1 ~]# modprobe br_netfilter
[root@k8s-node1 ~]# sysctl --system
[root@k8s-node1 ~]# systemctl  restart docker
[root@k8s-node1 ~]# docker info
 Registry Mirrors:
  https://reg.timinglee.org/
 Live Restore Enabled: false
两台工作机操作一样

2.3 Kubernetes集群部署

2.3.1 所有节点关闭swap

[root@k8s-master ~]# vim /etc/fstab
[root@k8s-master ~]# systemctl mask swap.target
Created symlink /etc/systemd/system/swap.target → /dev/null.
[root@k8s-master ~]# swapoff -a
[root@k8s-master ~]# swapon -s
[root@k8s-node2 ~]# vim /etc/fstab
[root@k8s-node2 ~]# systemctl mask swap.target
Created symlink /etc/systemd/system/swap.target → /dev/null.
[root@k8s-node2 ~]# swapoff -a
[root@k8s-node1 ~]# vim /etc/fstab
[root@k8s-node1 ~]# systemctl mask swap.target
Created symlink /etc/systemd/system/swap.target → /dev/null.
[root@k8s-node1 ~]# swapoff -a

2.3.2 安装k8s部署工具

[root@k8s-master ~]# mv cri-dockerd-0.3.14-3.el8.x86_64.rpm  libcgroup-0.41-19.el8.x86_64.rpm /mnt/
[root@k8s-master ~]# cd /mnt/
[root@k8s-master mnt]# ls
cri-dockerd-0.3.14-3.el8.x86_64.rpm  hgfs  libcgroup-0.41-19.el8.x86_64.rpm
[root@k8s-master mnt]# dnf install *.rpm -y
[root@k8s-master mnt]# systemctl start cri-docker
[root@k8s-master mnt]# scp cri-dockerd-0.3.14-3.el8.x86_64.rpm libcgroup-0.41-19.el8.x86_64.rpm root@172.25.254.10:/opt/
[root@k8s-master mnt]# scp cri-dockerd-0.3.14-3.el8.x86_64.rpm libcgroup-0.41-19.el8.x86_64.rpm root@172.25.254.20:/opt/
[root@k8s-master yum.repos.d]# cat k8s.repo
[k8s]
name=k8s
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm
gpgcheck=0
[root@k8s-master ~]# dnf install kubelet-1.30.0-150500.1.1 kubeadm-1.30.0-150500.1.1 --downloadonly --downloaddir=/mnt

node1和node2
[root@k8s-node1 ~]# dnf install /opt/*.rpm
[root@k8s-node2 ~]# dnf install /opt/*.rpm -y

 2.3.3 设置kubectl命令补齐功能

[root@k8s-master mnt]# dnf install bash-completion -y
[root@k8s-master mnt]# echo "source <(kubectl completion bash)" >> ~/.bashrc
[root@k8s-master mnt]# source ~/.bashrc

2.3.4 在master节点拉取K8S所需镜像

[root@k8s-master ~]# kubeadm config images pull \
> --image-repository registry.aliyuncs.com/google_containers \
> --kubernetes-version v1.30.0 \
> --cri-socket=unix:///var/run/cri-dockerd.sock
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-apiserver:v1.30.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-controller-manager:v1.30.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-scheduler:v1.30.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-proxy:v1.30.0
[config/images] Pulled registry.aliyuncs.com/google_containers/coredns:v1.11.3
[config/images] Pulled registry.aliyuncs.com/google_containers/pause:3.9
[config/images] Pulled registry.aliyuncs.com/google_containers/etcd:3.5.15-0
#上传到hub仓库 先建立新的k8s项目
[root@k8s-master ~]# docker images | awk '/google/{ print $1":"$2}' \
> | awk -F "/" '{system("docker tag "$0" reg.timinglee.org/k8s/"$3)}'
[root@k8s-master ~]# docker images | awk '/k8s/{system("docker push "$1":"$2)}'

测试

2.3.5 集群初始化

指定网络及其插件
[root@k8s-master ~]# vim /lib/systemd/system/cri-docker.service
[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --pod-infra-container-image=reg.timinglee.org/k8s/pause:3.9
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
[root@k8s-master ~]# systemctl daemon-reload
[root@k8s-master ~]# scp /lib/systemd/system/cri-docker.service root@172.25.254.10:/lib/systemd/system/cri-docker.service
[root@k8s-master ~]# scp /lib/systemd/system/cri-docker.service root@172.25.254.20:/lib/systemd/system/cri-docker.service
[root@k8s-node1 ~]# systemctl daemon-reload
[root@k8s-node2 yum.repos.d]# systemctl daemon-reload
[root@k8s-master ~]# kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository reg.timinglee.org/k8s --kubernetes-version v1.30.0 --cri-socket=unix:///var/run/cri-dockerd.sock

[root@k8s-master ~]# export KUBECONFIG=/etc/kubernetes/admin.conf
[root@k8s-master ~]# kubectl get nodes
NAME                       STATUS     ROLES           AGE   VERSION
k8s-master.timinglee.org   NotReady   control-plane   85s   v1.30.5
[root@k8s-master ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~.bash_profile
[root@k8s-master ~]# source ~.bash_profile

2.3.5 指定网络插件

[root@k8s-master ~]# vim kube-flannel.yml        
image: reg.timinglee.org/flannel/flannel:v0.25.5        
image: reg.timinglee.org/flannel/flannel-cni-plugin:v1.5.1-flannel1
image: reg.timinglee.org/flannel/flannel:v0.25.5
[root@k8s-master ~]# docker load -i flannel-0.25.5.tag.gz

先建立flannel项目
[root@k8s-master ~]# docker tag flannel/flannel:v0.25.5 reg.timinglee.org/flannel/flannel:v0.25.5
[root@k8s-master ~]# docker push reg.timinglee.org/flannel/flannel:v0.25.5
[root@k8s-master ~]# docker tag flannel/flannel-cni-plugin:v1.5.1-flannel1 reg.timinglee.org/flannel/flannel-cni-plugin:v1.5.1-flannel1
[root@k8s-master ~]# docker push reg.timinglee.org/flannel/flannel-cni-plugin:v1.5.1-flannel1
安装
[root@k8s-master ~]# kubectl apply -f kube-flannel.yml
测试
[root@k8s-master ~]# kubectl get nodes
NAME                       STATUS   ROLES           AGE   VERSION
k8s-master.timinglee.org   Ready    control-plane   17m   v1.30.5

2.3.6 将工作机加入集群

假设忘记令牌
[root@k8s-master ~]# kubeadm token create --print-join-command
kubeadm join 172.25.254.100:6443 --token wm3853.qg4qhb1q45kgwinw --discovery-token-ca-cert-hash sha256:5d1e635ef6a4bf60ff00c902f48b46aa6a5068295ba75c880ceb02eafc9adf1a

[root@k8s-node1 ~]# kubeadm join 172.25.254.100:6443 --token wm3853.qg4qhb1q45kgwinw --discovery-token-ca-cert-hash sha256:5d1e635ef6a4bf60ff00c902f48b46aa6a5068295ba75c880ceb02eafc9adf1a --cri-socket=unix:///var/run/cri-dockerd.sock
[root@k8s-node2 ~]# kubeadm join 172.25.254.100:6443 --token wm3853.qg4qhb1q45kgwinw --discovery-token-ca-cert-hash sha256:5d1e635ef6a4bf60ff00c902f48b46aa6a5068295ba75c880ceb02eafc9adf1a --cri-socket=unix:///var/run/cri-dockerd.sock

 2.3.7 检查集群状态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值