Kubernetes基本概念
本文记录博主在学习Kubernetes中碰到的一些基础概念,希望对大家也能有所帮助。
Pod
Pod中是运行的一组容器,Pod是kubernetes中应用的最小单位。
通过命令行创建Pod
# 创建pod,pod中容器镜像选择nginx
kubectl run mynginx --image=nginx
# 查看default名称空间的Pod
kubectl get pod
# 描述
kubectl describe pod 你自己的Pod名字
# 删除
kubectl delete pod Pod名字
# 查看Pod的运行日志
kubectl logs Pod名字
# 每个Pod - k8s都会分配一个ip
kubectl get pod -owide
# 使用Pod的ip+pod里面运行容器的端口
curl 192.168.169.136
# 集群中的任意一个机器以及任意的应用都能通过Pod分配的ip来访问这个Pod
通过yaml创建Pod
apiVersion: v1
kind: Pod
metadata:
labels:
run: myapp
name: myapp
spec:
containers:
- image: nginx
name: nginx
- image: tomcat:8.5.68
name: tomcat
- Pod内的容器不能使用相同的端口,否则会认为Pod启动失败,导致不断重启重试。
- 目前Pod只可以在集群内进行访问
Deployment
控制、管理Pod,使Pod拥有多副本,自愈,扩缩容等能力
创建Pod副本和扩缩容
通过yaml文件创建副本
apiVersion: apps/v1
kind: Deployment #部署资源类型
metadata:
labels:
app: my-dep #部署的标签
name: my-dep #部署的名称
spec:
replicas: 3 #副本数量
selector:
matchLabels:
app: my-dep
template:
metadata:
labels:
app: my-dep
spec:
containers: #容器参数
- image: nginx #容器镜像
name: nginx # 容器名称
修改副本数量
kubectl scale --replicas=5 deployment/my-dep
滚动更新
#修改部署中的nginx版本
kubectl set image deployment/my-dep nginx=nginx:1.16.1 --record
#查看部署的状态
kubectl rollout status deployment/my-dep
# 修改部署文件
kubectl edit deployment/my-dep
版本回退
#历史记录
kubectl rollout history deployment/my-dep
#查看某个历史详情
kubectl rollout history deployment/my-dep --revision=2
#回滚(回到上次)
kubectl rollout undo deployment/my-dep
#回滚(回到指定版本)
kubectl rollout undo deployment/my-dep --to-revision=2
Service
通过Pod的创建时标签,可以把相同作用的Pod提取出来,组成一个整体,对外提供服务,实现负载均衡。
Service可以整合Pod,提供给外部或者内部访问。
apiVersion: v1
kind: Service
metadata:
labels:
app: my-dep
name: my-dep
spec:
selector:
app: my-dep
ports:
- port: 8000 #service端口
protocol: TCP
targetPort: 80 #Pod的端口
type: ClusterIP #ClusterIP是在集群中可以访问,NodePort是外部可以访问
Ingress
Ingress不同上面的资源,需要进行安装才能使用,没安装可以参考Ingress安装教程,。
Ingress类似nginx,将用户的访问路由到不同的service,可以用来做反向代理、负载均衡、限流等,更多功能参考Ingress官方文档。
准备测试环境
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-server
spec:
replicas: 2
selector:
matchLabels:
app: hello-server
template:
metadata:
labels:
app: hello-server
spec:
containers:
- name: hello-server
image: registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/hello-server
ports:
- containerPort: 9000
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-demo
name: nginx-demo
spec:
replicas: 2
selector:
matchLabels:
app: nginx-demo
template:
metadata:
labels:
app: nginx-demo
spec:
containers:
- image: nginx
name: nginx
---
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx-demo
name: nginx-demo
spec:
selector:
app: nginx-demo
ports:
- port: 8000
protocol: TCP
targetPort: 80
---
apiVersion: v1
kind: Service
metadata:
labels:
app: hello-server
name: hello-server
spec:
selector:
app: hello-server
ports:
- port: 8000
protocol: TCP
targetPort: 9000
通过yaml配置路由规则
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-host-bar #Ingress名称
spec:
ingressClassName: nginx
rules:
- host: "hello.hanjiang.com"
http:
paths:
- pathType: Prefix #Prefix前缀匹配模式 Exact精确匹配模式
path: "/"
backend:
service:
name: hello-server
port:
number: 8000 #服务的端口号
- host: "demo.hanjiang.com"
http:
paths:
- pathType: Prefix #Prefix前缀匹配模式 Exact精确匹配模式
path: "/nginx" # 把请求会转给下面的服务,下面的服务一定要能处理这个路径,不能处理就是404
backend:
service:
name: nginx-demo ## java,比如使用路径重写,去掉前缀nginx
port:
number: 8000 #服务的端口号
路径重写
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
name: ingress-host-bar
spec:
ingressClassName: nginx
rules:
- host: "hello.hanjiang.com"
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: hello-server
port:
number: 8000
- host: "demo.hanjiang.com"
http:
paths:
- pathType: Prefix
path: "/nginx(/|$)(.*)" # 把请求会转给下面的服务,下面的服务一定要能处理这个路径,不能处理就是404
backend:
service:
name: nginx-demo ## java,比如使用路径重写,去掉前缀nginx
port:
number: 8000
流量限制
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-limit-rate
annotations:
nginx.ingress.kubernetes.io/limit-rps: "1" #限制每秒钟只能访问1次,超过限制进入503页面
spec:
ingressClassName: nginx
rules:
- host: "haha.hanjiang.com"
http:
paths:
- pathType: Exact
path: "/"
backend:
service:
name: nginx-demo
port:
number: 8000
存储抽象
PV:持久卷(Persistent Volume),将应用需要持久化的数据保存到指定位置
PVC:持久卷申明(Persistent Volume Claim),申明需要使用的持久卷规格
通过yaml创建PV
建新文件夹
#nfs主节点,创建文件夹
mkdir -p /nfs/data/01
创建pv.yaml文件
apiVersion: v1
kind: PersistentVolume #资源类型
metadata:
name: pv01-10m #名称
spec:
capacity:
storage: 512M #卷的大小
accessModes:
- ReadWriteMany #读写权限
storageClassName: nfs #存储类名称
nfs:
path: /nfs/data/01 #挂载文件夹路径
server: 192.168.64.128 #nfs的主服务器地址
应用yaml文件即可创建PV
使用PVC申请PV
PVC也是资源的一种
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nginx-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 200Mi #申请的大小
storageClassName: nfs #存储类名称
创建Pod绑定PVC
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-deploy-pvc
name: nginx-deploy-pvc
spec:
replicas: 2
selector:
matchLabels:
app: nginx-deploy-pvc
template:
metadata:
labels:
app: nginx-deploy-pvc
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
volumes:
- name: html
persistentVolumeClaim:
claimName: nginx-pvc
ConfigMap
抽取应用配置,并且可以自动更新
#创建文件
vim redis.conf
# 创建配置,redis保存到k8s的etcd;
kubectl create cm redis-conf --from-file=redis.conf
配置集的yaml
apiVersion: v1
data: #data是所有真正的数据,key:默认是文件名 value:配置文件的内容
redis.conf: |
appendonly yes
kind: ConfigMap
metadata:
name: redis-conf
namespace: default
创建pod绑定配置集
apiVersion: v1
kind: Pod
metadata:
name: redis
spec:
containers:
- name: redis
image: redis
command:
- redis-server
- "/redis-master/redis.conf" #指的是redis容器内部的位置
ports:
- containerPort: 6379
volumeMounts:
- mountPath: /data
name: data
- mountPath: /redis-master
name: config
volumes:
- name: data
emptyDir: {}
- name: config
configMap:
name: redis-conf
items:
- key: redis.conf
path: redis.conf
需要注意,更新配置集后redis的运行状态并不会改变,需要重启redis,只有具有热更新能力的中间件才能做到配置自动生效
Secret
Secret 对象类型用来保存敏感信息,例如密码、OAuth 令牌和 SSH 密钥。 将这些信息放在 secret 中比放在 Pod 的定义或者 容器镜像 中来说更加安全和灵活。
kubectl create secret docker-registry leifengyang-docker \
--docker-username=caoyu\
--docker-password=caoyuxxxx\
--docker-email=117090841@qq.com
以后创建pod需要拉取私人镜像,会去该账号下寻找
评论