【K8S实践】

本文详细介绍了K8S的基础知识,包括集群结构、Master和Node节点的组成,深入探讨了Scheduler调度原理和服务发现与负载均衡机制。此外,还介绍了如何在K8S中进行操作演示,如安装K8S、部署nginx以及使用yaml配置服务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、K8S 基本介绍

就在 Docker 容器技术被炒得热火朝天之时,大家发现,如果想要将 Docker 应用于具体的业务实现,是存在困难的——编排、管理和调度等各个方面,都不容易。于是,人们迫切需要一套管理系统,对 Docker 及容器进行更高级更灵活的管理。就在这个时候,K8S 出现了。K8S ,就是基于容器的集群管理平台,它的全称,是 kubernetes 。

2、K8S 集群

这个集群主要包括两个部分:

一个 Master 节点(主节点)

一群 Node 节点(计算节点)

一看就明白:Master 节点主要还是负责管理和控制。Node 节点是工作负载节点,里面具体的容器。

Apiserver: 网关

Etcd: 集群状态,node,service,pod

Controller: 每一种资源对应一种 controller 控制器

Schuduler:调度器,选择一个 node 执行请求

3、Master 节点

Master 节点包括 API Server、Scheduler、Controller manager、etcd。API Server 是整个系统的对外接口,供客户端和其它组件调用,相当于“营业厅”。Scheduler 负责对集群内部的资源进行调度,相当于“调度室”。Controller manager 负责管理控制器,相当于“大总管”。

4、Node 节点

Node 节点包括 Docker、kubelet、kube-proxy、Fluentd、kube-dns(可选),还有就是 Pod。

二、K8S 原理进阶

1 、Scheduler 调度原理

k8s scheduler 当前提供的默认调度流程分为两步:

1.预选调度过程,即遍历所有目标 Node,筛选出符合要求的候选节点,k8 是内置了多种预选策略供用户选择。

2.确定最优节点,在第一步的基础上,采用优选策略(xxx priority)计算出每个候选节点的

积分,积分最高者胜出。

2 、服务发现与负载均衡

2.1 、为什么需要服务发现

在 K8s 集群里面会通过 pod 去部署应用,与传统的应用部署不同,传统应用部署在给定的机器上面去部署,我们知道怎么去调用别的机器的 IP 地址。但是在 K8s集群里面应用是通过 pod 去部署的, 而 pod 生命周期是短暂的。在 pod 的生命周期过程中,比如它创建或销毁,它的 IP 地址都会发生变化,这样就不能使用传统的部署方式,不能指定 IP 去访问指定的应用。另外在 K8s 的应用部署里,之前虽然学习了 deployment 的应用部署模式,但还是需要创建一个 pod 组,然后这些 pod 组需要提供一个统一的访问入口,以及怎么去控制流量负载均衡到这个组里面。比如说测试环境、预发环境和线上环境,其实在部署的过程中需要保持同样的一个部署模板以及访问方式。因为这样就可以用同一套应用的模板在不同的环境中直接发布。

2.2 、Service :Kubernetes 中的服务发现与负载均衡

最后应用服务需要暴露到外部去访问,需要提供给外部的用户去调用的。我们上节

了解到 pod 的网络跟机器不是同一个段的网络,那怎么让 pod 网络暴露到去给外

部访问呢?这时就需要服务发现。

在 K8s 里面,服务发现与负载均衡就是 K8s Service。上图就是在 K8s 里 Service的架构,K8s Service 向上提供了外部网络以及 pod 网络的访问,即外部网络可以通过 service 去访问,pod 网络也可以通过 K8s Service 去访问。向下,K8s 对接了另外一组 pod,即可以通过 K8s Service 的方式去负载均衡到一组 pod 上面去,这样相当于解决了前面所说的复发性问题,或者提供了统一的访问入口去做服务发现,然后又可以给外部网络访问,解决不同的 pod 之间的访问,提供统一的访问地址。

2.3 、service

Service 一个应用服务抽象,定义了 Pod 逻辑集合和访问这个 Pod 集合的策略。

Service 代理 Pod 集合对外表现是为一个访问入口,分配一个集群 IP 地址,来自这个 IP 的请求将负载均衡转发后端 Pod 中的容器。

Service 通过 Lable Selector 选择一组 Pod 提供服务。

首先需要弄明白 Kubernetes 的三种 IP 这个问题:

Node IP:Node 节点的 IP 地址

Pod IP: Pod 的 IP 地址

Cluster IP:Service 的 IP 地址

3 、K8S 网络

在 K8s 中,kube-proxy 有三种模式在实现虚拟 IP、路由信息和报文转发。

userspace 代理模式: 过时,在 k8s 1.2 时候,抛弃

iptables 模式: k8s 默认使用网络模式

IPVS 模式: 速度快,linux 内核负载

三、操作演示

1 、安装 K8S

#1、关闭防火墙

Systemctl disable firewalld

Systemctl stop firewalld

#2、安装 etcd,kubernetes

Yum -y install etcd kubernetes

#3、查询版本

Kubectl version

#4、下载证书

wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm

#5、生成证书

rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv--to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem

#6、下载 google 镜像,防止中国墙

docker pull registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0

#修改镜像名称,名称是固定的

docker tag registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0

gcr.io/google_containers/pause-amd64:3.0

#7、修改 docker 配置文件

Vi /ect/sysconfig/docker

#修改为如下:

OPTIONS='--selinux-enabled=false --insecure-registry gcr.io'

#8、修改 kubernetes

Vi /etc/kubernetes/apiserver

#删除 Account

KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitR

anger,SecurityContextDeny,ResourceQuota"

#9、启动 k8s

systemctl restart etcd docker kube-apiserver kube-controller-manager kube-scheduler kubelet

kube-proxy

 

2 、部署 nginx

#创建 nginx deployment ,此时只创建了一个 deployment pod

kubectl run my-nginx --image=nginx:latest --port=80

#创建 service,对外暴露服务

kubectl expose deployment/my-nginx --type="NodePort" --port 80

3 、k8s 命令

#查看版本

Kubectl version

#查询集群

Kubectl cluster-info

#查询节点

kubectl get nodes

#运行一个镜像

kubectl run my-nginx --image=nginx:latest –replicas=2 --port=80

#查询 pod

Kubectl get pods

#查询 deployment

Kubectl get deployments

#查询 service

Kubectl describe svc

Kubectl get service

#删除 service

Kubectl delete service 名称

#删除 pod

Kubectl delete pod 名称

#删除 pod,必须删除 deployment

Kubectl delete deployment 名称

 

4 、yaml

规则:

语法格式:

• 缩进表示层级关系

• 不支持制表符“tab”缩进,使用空格缩进

• 通常开头缩进 2 个空格

• 字符后缩进 1 个空格,如冒号、逗号等

• “---” 表示 YAML 格式,一个文件的开始

• “#”注释

4.1、 Service Yaml

apiVersion: v1

kind: Service

metadata:

name: nginx

labels:

app: nginx

spec:

ports:

- port: 8080

protocol: TCP

targetPort: 30001

selector:

 app: nginx

 

4.2 、Deployment Yaml

apiVersion: extensions/v1beta1

kind: Deployment

metadata:

name: nginx

labels:

app: nginx

spec:

replicas: 2

selector:

matchLabels:

app: nginx

template:

metadata:

labels:

app: nginx

spec:

containers:

- image: nginx:latest

imagePullPolicy: IfNotPresent

name: nginx

4.3 、创建服务

# 创建 pod

Kubectl create -f deploy.yaml

# 创建服务

Kubectl create -f svc.yaml

# 升级集群(版本,负载策略,副本数量)

kubeclt apply -f deploy.yaml

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值