K8S基础及kubeadm方式部署1.26-Day01

一、Kubernetes介绍及核心组件

1.kubernetes简介

​ Kubernetes(简称K8S)是一个开源的容器编排平台,最初起源于谷歌内部的Borg,Borg是谷歌内部的大规模容器集群系统,负责对谷歌内部很多核心服务器的调度和管理。2014年由谷歌捐赠给云原生计算基金会(CNCF)进行维护。

​ Kubernetes提供了一个可扩展的平台,可以在多个主机上运行容器化应用程序,并提供自动化的部署、扩展和管理功能。它支持多种容器运行时(如Docker、CRI-O等),并提供了许多功能,包括自动容器重启、负载均衡、容器间通信、存储管理、自动扩展和滚动更新等。

​ Kubernetes采用了一组称为“控制器”的概念,它们负责管理应用程序的不同方面,如副本数、升级、滚动更新、扩展等。Kubernetes还提供了灵活的声明式配置模型,可以将应用程序的描述作为YAML或JSON文件提交给Kubernetes,从而实现对应用程序的自动化管理。

​ Kubernetes还提供了一个强大的API,使开发人员和运维人员可以通过各种编程语言和工具与Kubernetes进行交互。此外,Kubernetes还有一个活跃的社区和生态系统,提供了各种插件、工具和解决方案,以满足各种使用场景和需求。

官方地址https://kubernetes.io/zh/

GITHUB地址:https://github.com/kubernetes/kubernetes

2.kubernetes架构

在 Kubernetes 中,有两种节点: Master 节点和 Worker 节点(也称为 Node 节点)。

  • Master 节点是 Kubernetes 集群的控制中心,负责管理集群中所有的资源对象

  • Worker 节点是 Kubernetes 集群中运行容器工作负载的主机

image-20230413142113997

3.Master节点

Master 节点是 Kubernetes 集群的控制中心,负责管理集群中所有的资源对象。它主要有以下组件:

  1. kube-apiserver
  2. kube-controller-manager
  3. kube-scheduler
  4. etcd

3.1 kube-apiserver

kube-apiserver是K8S的统一入口,各组件协调者,所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给Etcd进行存储。它通过RESTful API接口向外部提供服务,API Server接收来自用户、命令行工具、Kubernetes组件和服务的请求,并根据请求的内容进行处理和响应。

官方说明地址:https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-apiserver/

API Server说明:

  • API Server的端口默认为6443,可以通过启动参数"--secure-port"进行修改。该端口用于接收客户端、dashboard等外部HTTPS请求。
  • 默认监听IP为0.0.0.0及本机所有IP,可以通过启动参数"--bind-address"设置监听指定的内网IP。
  • 实现基于Tocken文件或客户端证书及HTTP Base的认证。
  • 实现基于策略的账户鉴权及准入(RBAC
  • 客户端通过API Server实现对kubernetes的API远程以实现对kubernetes内部资源的增删改查等管理任务的分发。

API Server主要功能

  • 管理Pod、Service、Replication Controller、Deployment等Kubernetes资源的创建、更新和删除。
  • 管理节点的状态信息,如节点的健康状况和资源使用情况等。
  • 提供访问Kubernetes API的权限控制和认证机制,保证集群的安全性。
  • 支持Kubernetes插件机制,扩展集群的功能和支持新的资源类型。

API版本说明

  • Alpha:预览版,可能包含bug或错误,后期版本会修复且不兼容之前的版本,不建议使用
  • Beta:测试版,如storage.k8s.io/v1beta1,该版本可能存在不稳定或者潜在的bug,不建议生产使用
  • v1/v2/vX: 稳定版,如apps/v1,经过验证的stable版本,可以生产环境使用

3.2 kube-scheduler

kube-scheduler主要负载集群的资源调度,它的作用是为新创建的Pod分配一个节点来运行。当一个新的Pod被创建时,kube-scheduler会考虑一些策略来选择最合适的节点,例如节点的可用性、资源使用情况、标签匹配等等。一旦选择了合适的节点,kube-scheduler就会将该Pod绑定到该节点上,从而使该Pod能够在该节点上运行。

3.2 kube-controller-manager

kube-controller-manager是Kubernetes中的控制器,它负责集群的Node、Pod、Eenponit、Namespace等资源的管理。

kube-controller-manager由多个控制器组成,每个控制器负责一个特定的任务,例如:

  1. Replication Controller控制器:负责确保Pod的副本数量与用户指定的期望数量一致。
  2. Node Controller控制器:负责确保节点状态的正确性,如果节点出现故障或者失去连接,Node Controller将采取相应措施,例如从API服务器中删除该节点。
  3. Endpoint Controller控制器:负责将Service与其对应的Pod关联起来,确保每个Service都有一个合适的Endpoint。
  4. Namespace Controller控制器:负责创建和删除命名空间,并确保各个命名空间之间的隔离性。
  5. Service Account Controller控制器:负责创建和管理Service Account,Service Account是Kubernetes中的一种身份验证机制。

总之,kube-controller-manager的作用是确保集群中的各个资源状态的正确性和一致性,使得整个集群能够高效稳定地运行。

4.Node节点

Node节点是K8S的工作节点,负责运行应用程序的容器。每个node节点都有一些系统组件,例如kubeletkube-proxy,用于管理和维护节点和其上的容器。

4.1 kubelet

kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,比如创建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。kubelet将每个Pod转换成一组容器。

kubelet的主要职责包括以下几个方面:

  1. 接收Pod Spec:kubelet会从Kubernetes API服务器中获取分配给该节点的Pod Spec,以及需要运行的容器镜像和相关配置信息。
  2. 启动容器:kubelet会根据Pod Spec中的配置信息,启动容器并监控容器的运行状态,如果容器停止运行或崩溃,kubelet会自动重启容器。
  3. 管理容器状态:kubelet会监控容器的运行状态,并将容器的状态报告给API服务器,以便Kubernetes可以实时地监控容器的运行状况。
  4. 对接CRI:kubelet与容器运行时接口(CRI)进行交互,通过CRI与容器运行时通信,以确保容器运行时能够正确地管理和维护容器。
  5. 执行容器健康检查:kubelet会定期执行容器健康检查,以确保容器在运行过程中不会出现问题,如容器无响应、网络异常等。
  6. 拉取镜像:kubelet会根据Pod Spec中的配置信息,拉取需要运行的容器镜像,并将镜像缓存到本地节点,以便下次使用。

4.2 kube-proxy

kube-proxy是k8s的网络组件,主要负责集群内的服务暴露给外部网络,并为Pod之间提供网络代理和负载均衡功能

主要功能:

  1. 服务代理:kube-proxy可以为集群内的每个服务创建一个虚拟IP地址,将服务暴露给外部网络。当有请求到达服务的虚拟IP地址时,kube-proxy会将请求路由到集群中运行该服务的Pod上。
  2. 负载均衡:kube-proxy会为每个服务创建一个负载均衡器,并将请求均衡到后端运行该服务的多个Pod中。这样可以有效地提高服务的可用性和吞吐量。
  3. Pod间代理:kube-proxy还可以为Pod之间提供网络代理功能,实现在不同节点上的Pod之间的通信。
  4. 网络安全:kube-proxy可以为服务配置网络策略,控制服务的入站和出站流量,从而保证集群的网络安全。

二、Containerd

1.containerd简介

2.安装containerd

安装环境:Centos7.9

2.1YUM方式进行安装

# 安装工具包
yum install -y yum-utils device-mapper-persistent-data lvm2
# 设置yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# yum安装
yum update
yum install containerd -y
# 配置配置文件
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
# 修改pause镜像地址
sed 's#registry.k8s.io/pause:3.6#registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9#g' /etc/containerd/config.toml  -i
# 启动
systemctl daemon-reload
systemctl restart containerd

2.2验证runc环境

# 执行以下命令验证
whereis  runc
whereis containerd
runc -v

image-20230413220151336

2.3 验证镜像

# 下载镜像
ctr images pull docker.io/library/alpine:latest

image-20230413221641378

# 查看镜像
ctr images ls

image-20230413222621185

2.4 配置镜像加速

镜像默认的下载地址是国外官方镜像地址,下载比较慢,可以配置国内的阿里云进行加速

配置说明:https://help.aliyun.com/document_detail/60750.html

先登录阿里云:https://account.aliyun.com/

访问镜像服务:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

获取自己的加速地址,后面会用到

image-20230413223124362

按照说明进行配置:

# 修改配置文件
vim /etc/containerd/config.toml
# 在[plugins."io.containerd.grpc.v1.cri".registry.mirrors]新增
     [plugins."io.containerd.grpc.v1.cri".registry.mirrors] # 在此行下面新增
       [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
         endpoint = ["https://sodkcqix.mirror.aliyuncs.com"] # 配置自己的加速地址

image-20230413224220517

# 修改完成后重启
systemctl  daemon-reload
systemctl  restart containerd

3.nerdctl命令行工具

自带的ctr工具不好用,一般推荐使用nerdctl,此命令行与docker命令基本一致

githu地址:https://github.com/containerd/nerdctl

3.1 安装

# 下载安装包
wget https://github.com/containerd/nerdctl/releases/download/v1.3.0/nerdctl-1.3.0-linux-amd64.tar.gz

如果wget无法下载,可以通过浏览器下载

image-20230413230357724

# 解压安装
tar xvf nerdctl-1.3.0-linux-amd64.tar.gz -C /usr/local/bin/
# 查看
nerdctl version

3.2 配置文件修改

# 查看配置文件路径
nerdctl --help |grep toml
# 创建目录
mkdir /etc/nerdctl/
# 新增配置文件
cat  > /etc/nerdctl/nerdctl.toml <<EOF
namespace = "k8s.io"
debug = false
debug_full = false
insecure_registry = true
EOF

3.3安装CNI

containerd本身不负责网络配置,而是通过 CNI插件来实现网络配置

# 下载安装包
wget https://github.com/containernetworking/plugins/releases/download/v1.2.0/cni-plugins-linux-amd64-v1.2.0.tgz
# 创建保存cni插件的路径
mkdir /opt/cni/bin -p 
# 解压安装
tar xvf cni-plugins-linux-amd64-v1.2.0.tgz -C /opt/cni/bin/

安装完成后可以用常用命令测下,命令方式和docekr基本一致,只不过是把docker改成nerdctl

nerdctl pull nginx:latest

image-20230413233507403

4.nerdctl常用操作

4.1 创建nginx容器

nerdctl run -d -p 8000:80 --name=nginx-test --restart=always nginx:latest

image-20230413234721413

启动完成后访问:

192.168.248.150:9000

image-20230413234756090

查看容器日志:

# 查看容器id
nerdctl ps
# 查看容器日志
nerdctl logs  -f c448b28d4926

打开日志后,可以再试试访问看是否有最新日志打印

image-20230413235024635

4.2 创建tomcat容器

# 启动tomcat容器
nerdctl run -d -p 8080:8080 --name=tomcat-test --restart=always tomcat:7.0.88-alpine
# 启动完成后进入容器
nerdctl  exec -it 63cb67d3c4dc /bin/bash
# 创建一个测试页面
echo "TEST" >> /usr/local/tomcat/webapps/ROOT/test.html

访问测试页面

http://192.168.248.150:8080/test.html

image-20230414001433701

4.3 创建mysql容器

# 创建mysql数据目录
mkdir /data/mysql -p
# 启动容器,并挂载到/data/mysql
nerdctl run -t -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /data/mysql:/var/lib/mysql -d mysql:5.6.39 

测试访问,使用mysql连接工具测试访问

image-20230414001806264

创建测试库

image-20230414001846553

查看挂载目录是否正常

image-20230414001909629

三、kubeadm安装k8s

1.环境说明

说明 系统 资源 IP
K8S-Master01 Cenots7.9 2C4G 192.168.248.150
K8S-Node01 Cenots7.9 2C4G 192.168.248.151
K8S-Node02 Cenots7.9 2C4G 192.168.248.152

2.系统初始化

在所有节点完成初始化操作

# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

# 关闭selinux:
setenforce 0 # 临时
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久

# 关闭swap:
swapoff -a  # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab  # 永久


# 修改hosts文件,根据实际IP进行修改
cat >> /etc/hosts << EOF
192.168.248.150 k8s-master1
192.168.248.151 k8s-node1
192.168.248.152 k8s-node2
EOF
# 修改主机名
# 192.168.248.150服务器
hostnamectl set-hostname  k8s-master1
# 192.168.248.151服务器
hostnamectl set-hostname  k8s-node1
# 192.168.248.152服务器
hostnamectl set-hostname  k8s-node2
# 修改完成后查看
hostname

同步服务器时间

yum install chrony -y
# 同步阿里云的时间
server ntp1.aliyun.com iburst

image-20230418234307775

启动服务

systemctl enable chronyd
systemctl start chronyd
systemctl status chronyd

查看时间是否一致

image-20230418234450528

3.内核参数优化

vim /etc/sysctl.conf
# 添加以下内容
net.ipv4.ip_forward=1
vm.max_map_count=262144
kernel.pid_max=4194303
fs.file-max=1000000
net.ipv4.tcp_max_tw_buckets=6000
net.netfilter.nf_conntrack_max=2097152
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness=0

内核模块开机挂载:

vim /etc/modules-load.d/modules.conf
ip_vs
ip_vs_lc
ip_vs_lblc
ip_vs_lblcr
ip_vs_rr
ip_vs_wrr
ip_vs_sh
ip_vs_dh
ip_vs_fo
ip_vs_nq
ip_vs_sed
ip_vs_ftp
ip_vs_sh
ip_tables
ip_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
xt_set
br_netfilter
nf_conntrack
overlay

配置最打打开文件数(测试环境可以不优化, 生产环境一定要优化)

vim  /etc/security/limits.conf
# 添加一下内容
root            soft    core            unlimited
root            hard    core            unlimited
root            soft    nproc           1000000
root            hard    nproc           1000000
root            soft    nofile          1000000
root            hard    nofile          1000000
root            soft    memlock         32000
root            hard    memlock         32000
root            soft    msgqueue        8192000
root            hard    msgqueue        8192000

配置生效

sysctl -p
# 可能会出现以下报错,执行以下命令再次执行
modprobe br_netfilter

image-20230419173832026

4.安装运行时

上传安装脚本包及脚本

# 解压
tar xvf runtime-docker20.10.19-containerd1.6.20-binary-install.tar.gz
# 运行安装脚本
bash runtime-install.sh containerd

运行完成后,查看是否正常

systemctl  status containerd

5.安装kubeadm、kubectl、kubelet

配置镜像源,查看阿里云的配置方法进行配置

https://developer.aliyun.com/mirror/kubernetes?spm=a2c6h.13651102.0.0.3e221b11NFKTes

配置源:

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

进行安装

# 指定安装版本
yum install  kubelet-1.26.3 kubeadm-1.26.3 kubectl-1.26.3 -y
systemctl enable kubelet && systemctl start kubelet

6.安装初始化镜像

由于初始化镜像默认的是国外地址,需要提前下载好

查看需要提前下载的镜像:

kubeadm config images list --kubernetes-version v1.26.3

image-20230419002519786

新建以下下载脚本

images-down.sh

#!/bin/bash
nerdctl pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.26.3
nerdctl pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controllermanager:v1.26.3
nerdctl pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.26.3
nerdctl pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.26.3
nerdctl pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9
nerdctl pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.6-0
nerdctl pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.9.3

执行脚本

bash images-down.sh

7.kubernetes集群初始化

7.1 master节点

kubeadm init --apiserver-advertise-address=192.168.248.150 --apiserver-bind-port=6443 --kubernetes-version=v1.26.3 --pod-network-cidr=10.100.0.0/16 --service-cidr=10.200.0.0/16 --service-dns-domain=cluster.local --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --ignore-preflight-errors=swap

参数说明:

--apiserver-advertise-address: master节点ip地址
--apiserver-bind-port: apiserver端口
--pod-network-cid:集群pod的ip
--image-repository:
--ignore-preflight-errors:忽略swap错误

初始化成功后如下图:

image-20230419214027257

按照提示操作

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

查看节点信息

kubectl  get nodes

查看报以上错误,这是因为kubelet的默认引擎是cgroupfs,早期的docker和containerd是cgoupfs,现在都要改成systemd。所以用于容器限制的,kubelet使用的是systemd,运行时必须也得是systemd

7.2 添加node节点

在node节点执行添加命令,

kubeadm join 192.168.248.150:6443 --token 8725ut.j3qq9gbkf29f0h34 \
        --discovery-token-ca-cert-hash sha256:3eb2a073676895cd204eb6b95c1f45901d7a997f9ed4c156a

以上tokenhash有时限制,如果失效可以重新生成

kubeadm token create --print-join-command

添加完成后,可以查看是否添加成功(这里状态是Ready,是因为提前把网络插件安装了)

image-20230420170317401

如果node节点加入有问题,可以重新进行添加

# 在node节点执行
kubeadm reset 
rm /etc/cni/net.d/* -f
systemctl daemon-reload
systemctl restart kubelet
# 重新执行join
kubeadm join 192.168.248.150:6443 --token 8725ut.j3qq9gbkf29f0h34 \
        --discovery-token-ca-cert-hash sha256:3eb2a073676895cd204eb6b95c1f45901d7a997f9ed4c156a

7.3部署网络插件

master节点执行

# 下载
curl https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/calico.yaml -O calico.yaml

注意还需要修改里面定义Pod网络(CALICO_IPV4POOL_CIDR),与前面kubeadm init的 --pod-network-cidr指定的一样。10.100.0.0/16

vim calico.yaml
# 修改里面定义Pod网络
             - name: CALICO_IPV4POOL_CIDR
               value: "10.100.0.0/16"

image-20230420180345562

部署

kubectl apply -f calico.yaml
# 执行完成后查看
kubectl get pods -n kube-system

image-20230420185717478

8.安装部署 Dashboard

Dashboard是k8s官方提供的一个web页面

yaml地址:https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部:

image-20230420192707246

spec:
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30001
  selector:
    k8s-app: kubernetes-dashboard
  type: NodePort

修改完成后

image-20230420192854016

# 部署
kubectl  apply -f dashboard-2.7.0.yaml
# 查看
kubectl  get pod,svc -n kubernetes-dashboard

image-20230420193056225

访问页面:https://NodeIP:30001

NodeIP是指随意一个node服务器ip,如:https://192.168.248.150:30001/

image-20230420193132619

创建service account并绑定默认cluster-admin管理员集群角色:

kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin
kubectl create token dashboard-admin -n kubernetes-dashboard

执行完复制token

image-20230420193518915

image-20230420193525660

posted @   xxxy丶  阅读(464)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
点击右上角即可分享
微信分享提示