【K8S】K8S入门基础知识
一、K8S基础知识
- K8S是什么
K8S(Kubernetes)是⼀个容器集群管理系统,可以做容器集群的⾃动化部署,⾃动化扩缩容,维护等功能
- 为什么要用K8S
传统应⽤部署是通过将程序打包在服务器上运⾏,通过运行脚本将程序跑起来,如果⼀个服务器⽆法响应⼤量请求,需要通过运维⼈员添加服务器来做负载均衡来分担压⼒,在此过程中,是有⼈⼒介⼊的过程的,K8S⽤于解决该问题
- K8S的架构
K8S是属于主从设备模型(Master-Slave模型),Master节点主要负责容器的调度、管理和运维,Slave节点负责⽤户程序的执⾏,主节点⼀般称之为Master Node或者Head Node,从节点⼀般称之为Worker Node或者Node,⼀般来说,主节点或者从节点都是K8S的Master组件和Slave组件的实体服务器,每⼀个Node节点都对应着⼀台服务器(可以将Master和Slave安装在同⼀台服务器上,但是不推荐),所有的节点构成K8S集群系统,在⼀个集群中可以存在多个Master节点和Slave节点
- 通过K8S能做什么
1.快速部署应用
2.快速扩展应用
3.无缝对接新的应用功能
4.节省资源,优化硬件资源的使用
- K8S几个基本概念
Pod:Pod是在Kubernetes中创建和管理的最⼩可部署的计算单元
Deployment:作⽤是管理和控制Pod和ReplicaSet,管控它们运⾏在⽤户的期望之中
ReplicaSet:管理和控制Pod,但是它是受控于Deployment的,类似于包⼯头下的⼩包⼯头
Service:负责管控Pod的⽹络服务,K8S中的服务不同于我们常说的服务,在官⽅给的解释中说到,Kubenetes为Pods提供⾃⼰的IP地址,并为⼀组Pod提供相同的DNS域名,并且可以在它们之间进⾏负载均衡,这相当于API⽹关,做⼀个负载均衡器。
- 内容来自 kubernetes中文社区
二、Service
二、一些常用命令
- 允许Master节点调度Pod,默认Master节点不允许部署调度Pod,使用如下命令去除污点
kubectl taint nodes --all node-role.kubernetes.io/master-
- 节点Node相关
kubectl get node -owide #查看节点信息
kubectl top node #查看Node的资源使用情况
kubectl describe node nodeName #查询节点的详细信息
- 节点标签相关,标签可以加在各种资源上,进行关联
kubectl get node --show-labels #查看节点标签
kubectl label nodes xxx k1=v1 #给节点添加标签
kubectl label nodes xxx k1- #删除标签
- 命名空间相关,NameSpace是一组资源和对象的抽象,有一个默认的NameSpace(Default)
kubectl create ns #创建ns
kubectl get ns #获取所有的NameSpace
- Pod相关,Service命令与管理Pod的一致,将【pod】替换成【service】
kubectl apply -f pod-nginx.yml #使用yaml文件创建Pod
kubectl delete -f pod-nginx.yml #使用yaml文件删除Pod
kubectl get pod -n ns #查看ns下所有的Pod
kubectl describe pod -n k8s-demo xxx #查看Pod的详细信息
kubectl delete pod -n ns xxx #删除Pod
- Deployment的创建方式和通过yaml文件创建Pod类似,是Pod的管理者
kubectl set image deploy nginx-deployment -n ns *=nginx:latest #修改Pod的镜像版本
kubectl scale deploy -n k8s-demo nginx-deployment --replicas=2 #设置Pod的副本数量
Pod是平凡的,它门会被创建,也会死掉(生老病死),并且他们是不可复活的,每个pod都有自己的ip,这些IP也随着时间的变化也不能持续依赖。这样就引发了一个问题:如果一些Pods提供了一些功能供其它的Pod使用(让我们叫作前台),在kubernete集群中是如何实现让这些前台能够持续的追踪到这些后台的。答案是Service
三、yaml示例
- 创建Pod
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: demo
spec:
nodeSelector:
app: nginx
containers:
- name: nginx
image: nginx:1.18.0
# 镜像拉取策略,默认是IfNotPresent,其余还有Always, Never
imagePullPolicy: IfNotPresent
- 创建deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: demo
spec:
# 副本数
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
# 绑定节点
nodeName: demoNode
# 通过标签进行节点选择
nodeSelector:
app: nginx
containers:
- name: nginx
image: nginx:1.18.0
env:
- name: k1
value: v1
ports:
- containerPort: 80
# 存活探针
livenessProbe:
httpGet:
path: /index.html
port: 80
initialDelaySeconds: 3
periodSeconds: 3
# 就绪探针
readinessProbe:
httpGet:
path: /index.html
port: 80
initialDelaySeconds: 3
periodSeconds: 3
- 创建Service
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
# 通过标签与pod匹配
selector:
app: nginx
ports:
- name: default
protocol: TCP
port: 80
targetPort: 80
type: ClusterIp
说明:以上K8S内容只是本人作为一个简单入门的记录,包含了日常工作的基本使用,再往深的内容并不涉及,比如Etcd存储,调度器,监控器等等,这些内容可以上Kuberneters的中文社区自己学习