k8s安装:https://www.cnblogs.com/zhh567/p/16894203.html
结构
- api server 用于管理各种网络接口,负责组件间的交互和对外暴露接口。
- etcd 是位于master的数据库
- kube-scheduler 编排容器
- kube-controller manager 管理cpu、内存等资源
- kubelet 接收master发送的命令并进行处理
- kube-proxy 负责处理k8s的网络请求、负载均衡等
- kubectl 与 api server 进行交互
常见概念
命名空间 namespace
k8s集群中是实现逻辑上隔离,为组织、安全提供方便。namespace是一组资源和对象的抽象集合,可将系统内部对象划分为不同项目组和用户组。
默认存在的namespace:
- default 用户资源默认创建于default命名空间
- kube-system k8s系统组件使用
- kube-node-lease 集群节点租约状态
- kube-public 公共资源使用(现在不常用)
kubectl get pod --all-namespaces
kubectl get pod -A
kubectl get pod # 查看default命名空间下资源
kubectl get namespace
kubectl get ns
kubectl create namespace my-ns
kubectl delete namespace my-ns
pod
是一个或多个容器的封装,是k8s的最小调度单元。这些容器共享存储、网络、命名空间。
- 网络:pod被分配一个唯一ip,内部每个容器共享namespace、ip、端口。pod内可通过localhost的不同端口通信。
- 存储:pod能被指定共享存储卷的集合,内部容器都能访问共享存储卷。存储卷也可在一个pod持久化,防止其中容器要被重启。
k8s一般通过控制器和模板进行pod的配置和调度,而非直接创建pod。
kubectl get pods
kubectl get pod -o wide # 输出更多信息
kubectl get pods -n my-ns
kubectl get pods -A
# 创建deployment,使用其管理pod
kubectl run tomcat9-test --image=tomcat:9.0.20-jre8-alpine --port=8080 # 不推荐使用命令行创建,用模板创建
# 扩容 pod
kubectl scale --replicas=3 deployment/tomcat9-test # 每个pod有独立的ip
deployment
作为控制器管理pod,创建的pod都关联到deployment。使用 kubectl delete pod xxx
删除pod后,deployment会自动重新启动一个新的pod。
具有上线部署、滚动升级、创建副本、回滚到以前某一版本(成功/ 稳定)等功能。
Deployment包含ReplicaSet,除非需要自定义升级功能或者根本不需要升级Pod,否则还是建议使用Deployment而不直接使用ReplicaSet 。
kubectl get deployment
kubectl get deployment -o wide
kubectl delete deployments.apps tomcat-test # 删除deployment,对应的pod也被删除
更多控制器:
控制器名称 作用 Deployment 声明式更新控制器,用于发布无状态应用 ReplicaSet 副本集控制器,用于对Pod进行副本规模 扩大或剪裁 StatefulSet 有状态副本集(例如MySQL要保存数据),用于发布有状态应用 DaemonSet 在k8s集群每一个Node上运行一个副本, 用于发布监控或日志收集类等应用 Job 运行一次性作业任务 CronJob 运行周期性作业任务
service
为集群外提供服务。service有内部端口和外部端口两个不同的端口,分别搭配集群ip和外部ip。
# 创建service用于对外服务
kubectl expose deployment tomcat9-test --name=tomcat9-svc
--port=8888 # 暴露给集群内其他应用
--target-port=8080 # 指定pod端口
--protocol=TCP
--type=NodePort # 生成一个随机的端口用于外部访问,可通过模板指定范围
kubectl get service # 可以看见服务对集群内和对外暴露的端口
kubectl get svc -o wide
kubectl
kubectl [command] [TYPE] [NAME] [flags]
- command:create get describe delete
- TYPE:指定资源类型,单数、复数、缩写都可以。
- NAME:资源名称
kubectl get pod example-pod1 example-pod2 # 相同类型 kubectl get pod/example-pod1 replicationcontroller/example-rc1 # 不同类型 kubectl get pod -f ./pod.yaml # 通过配置文件指定
# describe 子命令用于查看详细描述
kubectl describe TYPE NAME_PREFIX
kubectl describe pods/nginx
kubectl describe pods
# Describe pods by label name=myLabel
kubectl describe po -l name=myLabel
kubectl describe nodes ubuntu01 # 查看节点
# 进入pod内部执行命令
kubectl exec -it tomcat9-test-d745c83a2b-8xc9 sh
kubectl exec -it tomcat9-test-d745c83a2b-8xc9 -- mkdir /dir00
# 看日志
kubectl logs -f pod-id
# 输出pod格式到yaml文件
kubectl get pod web-pod-13je7 -o yaml
# 强制删除pod
kubectl delete podname --force --grace-period=0
资源文件
应用配置文件:kubectl apply -f lagounamespace.yml
删除指定资源:kubectl delete -f lagounamespace.yml
# 资源清单有5个顶级字段
apiVersion: group/apiversion # 如果没有给定 group 名称,那么默认为 core,可以使用kubectl apiversions # 获取当前 k8s 版本上所有的 apiVersion 版本信息( 每个版本可能不同 )
kind: # 资源类别
metadata: # 资源元数据
name
namespace
lables
annotations # 主要目的是方便用户阅读查找
spec: # 期望的状态(disired state)
status: # 当前状态,本字段有 Kubernetes 自身维护,用户不能去定义
---
# 相关类型
apiVersion <string> # 表示字符串类型
metadata <Object> # 表示需要嵌套多层字段
labels <map[string]string> # 表示由k:v组成的映射
finalizers <[]string> # 表示字串列表
ownerReferences <[]Object> # 表示对象列表
hostPID <boolean> # 布尔类型
priority <integer> # 整型
name <string> -required- # 如果类型后面接 -required-,表示为必填字段
查看相关信息:
kubectl api-versions
kubectl explain pod
# 创建 namespace
apiVersion: v1
kind: Namespace
metadata:
name: lagou
# 创建 pod
# 注意:使用命令行创建的pod会默认启动一个deployment,使用配置文件创建时不会启动deployment用于重启pod
apiVersion: v1
kind: Pod
metadata:
name: tomcat9
labels:
app: tomcat9
spec:
containers:
- name: tomcat9
image: tomcat:9.0.20-jre8-alpine
imagePullPolicy: IfNotPresent
restartPolicy: Always
# imagePullPolicy:
# Always:总是拉取 pull
# IfNotPresent:如果本地有镜像,使用本地,如果本地没有镜像,下载镜像。
# Never:只使用本地镜像,从不拉取
# restartPolicy:
# Always:只要退出就重启。
# OnFailure:失败退出时(exit code不为0)才重启
# Never:永远不重启
# 创建 deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-deployment
labels:
app: tomcat-deployment
spec:
replicas: 3
template:
metadata:
name: tomcat-deployment
labels:
app: tomcat
spec:
containers:
- name: tomcat-deployment
image: tomcat:9.0.20-jre8-alpine
imagePullPolicy: IfNotPresent
restartPolicy: Always
selector:
matchLabels: # 在Deployment中必须写matchLables
app: tomcat # 要和 spec.template.labes.app 对应
# 创建一个 service 和 deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-deploy
labels:
apps: tomcat-deploy
spec:
replicas: 1
template:
metadata:
name: tomcat-deploy
labels:
app: tomcat-pod
spec:
containers:
- name: tomcat-deploy
image: tomcat:9.0.20-jre8-alpine
imagePullPolicy: IfNotPresent
resources:
limits:
memory: "128Mi"
cpu: "500m"
ports:
- containerPort: 8080
restartPolicy: Always
selector:
matchLabels:
app: tomcat-pod # 注意于 spec.template.labels.app 要相同
---
# 一个文件中可创建多种资源,使用 --- 分割
apiVersion: v1
kind: Service
metadata:
name: tomcat-svc
spec:
selector:
app: tomcat-pod # 对应 Deployment.spec.template.labels.app 内容
ports:
- port: 8888 # 集群内访问service使用的端口
targetPort: 8080 # Pod中容器端口
nodePort: 30088 # 通过NodePort实现外网用户访问k8s集群内service(30000-32767)
protocol: TCP
type: NodePort
#Service 类型
# ClusterIP: 默认,分配一个集群内部可以访问的虚拟IP
# NodePort: 在每个Node上分配一个端口作为外部访问入口
# LoadBalancer:工作在特定的Cloud Provider上,例如Google Cloud,AWS,OpenStack
# ExternalName:表示把集群外部的服务引入到集群内部中来,即实现了集群内部pod和集群外部的服务进行通信
Pod 生命周期
initC阶段是容器初始化步骤,会顺序执行,一直重复直到全部成功。post start、pre stop 是回调函数的调用时机。readiness probe 和 liveness probe 是就绪检测和存活检测。
initC
- 创建在initC阶段依赖其他服务的pod
一个在initC阶段依赖其他服务的Pod
apiVersion: v1 kind: Pod metadata: name: myapp-pod labels: app: myapp spec: containers: - name: myapp-container image: busybox:1.32.0 imagePullPolicy: IfNotPresent command: ['sh', '-c', 'echo The app is running! && sleep3600'] resources: limits: memory: 512Mi cpu: "1" initContainers: # initC 容器,会按顺序执行,一个容器结束后才会执行下一个。所有initC容器退出后才能结束初始阶段 - name: init-myservice image: busybox:1.32.0 imagePullPolicy: IfNotPresent command: ['sh', '-c', 'until nslookup myservice; do echo wating for myservice; sleep 2; done;'] - name: init-mydb image: busybox:1.32.0 imagePullPolicy: IfNotPresent command: ['sh', '-c', 'until nslookup myservice; do echo wating for mydb; sleep 3; done;']
- 启动pod后可通过
kubectl logs myapp-pod -c init-myservice
看见 wating for myservice,kubectl describe pod myapp-pod
查看详情,再创建第一个服务myservice
apiVersion: v1 kind: Service metadata: name: myservice spec: ports: - protocol: TCP port: 80 targetPort: 9376
- 可通过
kebectl logs myapp-pod -c init-mydb
看见 wating for mydb,再创建第二个服务mydb
apiVersion: v1 kind: Service metadata: name: mydb spec: ports: - protocol: TCP port: 80 targetPort: 9377
- 当两个服务都启动后,pod结束initC阶段
readiness probe
就绪检测,检测通过了才会启动
apiVersion: v1
kind: Pod
metadata:
name: readinesspod-test
labels:
name: readinesspod-test
spec:
containers:
- name: readinesspod-test
image: nginx:1.17.10-alpine
readinessProbe: # 就绪探针
httpGet:
port: 80
path: /index.html
initialDelaySeconds: 2 # 初始化时间
periodSeconds: 3 # 重新检测时间
在这个示例中,只有创建相应的html页面后才能正常启动。
liveness probe
存活检测,如果检测失败就重启
检测文件是否存在,不存在则重启:
apiVersion: v1
kind: Pod
metadata:
name: livenessprobepod1-test
labels:
app: livenessprobepod1-test
spec:
containers:
- name: livenessprobepod1-test
image: busybox:1.32.0
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'touch /tmp/livenesspod; sleep 10; rm -rf /tmp/livenesspod; sleep 3600;']
livenessProbe:
exec:
command: ['sh', '-c', 'test -e /tmp/livenesspod'] # 检测到文件不存在,就会重启容器,因为重启策略是Always
initialDelaySeconds: 1
periodSeconds: 3
restartPolicy: Always
通过能否正常访问http端口,判断pod能够正常提供服务
apiVersion: v1
kind: Pod
metadata:
name: livenessprobepod2-test
labels:
app: livenessprobepod2-test
spec:
containers:
- name: livenessprobepod2-test
image: busybox:1.32.0
imagePullPolicy: IfNotPresent
livenessProbe:
httpGet:
port: 80
path: /index.html
initialDelaySeconds: 1
timeoutSeconds: 10
restartPolicy: Always
通过tcp进行存活检测
# 启动后因为无法访问80端口,所以反复重启。容器监听8080端口后pod不再重启
apiVersion: v1
kind: Pod
metadata:
name: livenesspod3-test
labels:
app: livenesspod3-test
spec:
containers:
- name: livenesspod3-test
image: nginx:1.17.10-alpine
imagePullPolicy: IfNotPresent
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 3
periodSeconds: 3
timeoutSeconds: 3
restartPolicy: Always
poststart prestop
钩子程序,在容器开始和结束时调用回调函数
apiVersion: v1
kind: Pod
metadata:
name: lifecle-test
labels:
app: lifecle-test
spec:
containers:
- name: lifecle-test
image: busybox:1.32.0
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'sleep 5000']
lifecycle:
postStart: # 容器成功启动后执行命令
exec:
command: ['mkdir', '-p', '/tmp/k8s/dir']
preStop:
httpGet: # 容器结束前访问指定端口
scheme: http
host: www.baidu.com
port: 80
path: /
restartPolicy: Always
标签:kubectl,01,name,tomcat,test,pod,k8s,spec
From: https://www.cnblogs.com/zhh567/p/17479320.html