Kubernetes的日常使用
kubectl edit cm rds-cf -n devops (修改configmap),修改了CM,Pod里面的配置文件会跟着变。PV:持久卷(Persistent Volume),将应用需要持久化的数据保存到指定位置。配置值未更改,因为需要重新启动 Pod 才能从关联的 ConfigMap 中获取更新的值。1、集群ip模式(默认不加 --type ClusterIP)集群内部访问。运行中的
一、名称空间(namespace)
用来隔离资源
#创建空间
kubectl create ns hello
#通过yml文件创建
apiVersion: v1
kind: Namespace
metadata:
name: hello
kubectl apply -f yaml文件名
#查看所有空间
kubectl get ns
#删除空间
kubectl delete ns hello
#通过yml文件删除空间
kubectl delete -f yaml文件名
二、pod
运行中的一组容器,pod是k8s中应用的最小单位
#查看所有pod
kubectl get pod -A
#查询指定pod
kubectl get pod -n ns 名称空间
#创建pod
kubectl run 名字 --image=镜像名
#查看pod创建信息
kubectl describe pod pod名字 -n 名称空间
#查看运行日志
kubectl logs pod名 -n 名称空间
#查看pod ip
kubectl get pod pod名 -owide -n 名称空间
#删除pod
kubectl delete -n 名称空间 pod pod名
使用yml文件创建pod
apiVersion: v1
kind: Pod
metadata:
labels:
run: myapp
name: myapp
spec:
containers:
- image: nginx
name: nginx
- image: tomcat:8.5.68
name: tomcat
三、Deployment(无状态应用配置)
1、创建多副本
kubectl create deploy mynginx --image=nginx --replicas=3
#–dry-run 显示创建的yaml
2、使用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
3、扩缩容
kubectl scale deploy/名字 --replicas=个数 -n 名称空间
#修改配置文件(replicas)
kubectl edit deploy 名字 -n 名称空间
4、滚动更新
#查看镜像名
kubectl get deploy/名字 -o yaml -n 名称空间
#更新镜像
kubectl set image deploy/myng nginx=nginx:1.16 -n 名称空间 --record
#--record 记录更新
#修改配置文件
kubectl edit deployment/名字
5、版本回退
#查看历史记录
kubectl rollout history deploy/名字 -n 名称空间
#查看某个记录详情
kubectl rollout history deploy/名字 -n 名称空间 --revision=版本号
#回滚到上次版本
kuebectl rollout undo deploy/名字 -n 名称空间
#回滚到某个版本
kubectl rollout undo deploy/名字 -n 名称空间 --to-revision=版本号
除了Deployment,k8s还有 StatefulSet
、DaemonSet
、Job
等 类型资源。我们都称为 工作负载
。
有状态应用使用 StatefulSet
部署,无状态应用使用 Deployment
部署
四、Service(将一组pods公开为网络服务的抽象方法)
1、集群ip模式(默认不加 --type ClusterIP)集群内部访问
#暴露deploy
kubectl expose deploy 名字 --port=对外端口 --target-port=内部端口
# 等同于没有--type的
kubectl expose deployment my-dep --port=8000 --target-port=80 --type=ClusterIP
#查看pod标签
kubectl get pod --show-lables -n 名称空间
#使用标签查看pod
kubectl get pod -l 标签(app=nginx)
#查看集群ip
kubectl get service -n 名称空间
#集群内使用service地址可以任意访问
#pod内部可以使用域名访问
服务名.名称空间.svc
curl mynginx.devops.svc:8000
使用yaml文件创建
apiVersion: v1
kind: Service
metadata:
labels:
app: my-dep
name: my-dep
spec:
selector:
app: my-dep
ports:
- port: 8000
protocol: TCP
targetPort: 80
2、NodePort(集群外部也可访问)
kubectl export deploy 名字 --port=8000 --target-port=80 -type=NodePort
yaml方式创建
apiVersion: v1
kind: Service
metadata:
labels:
app: my-dep
name: my-dep
spec:
ports:
- port: 8000
protocol: TCP
targetPort: 80
selector:
app: mynginx
type: NodePort
NodePort范围在 30000-32767 之间(随机)
五、Ingress(用于实现用域名的方式访问k8s内部应用)
1、安装
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.47.0/deploy/static/provider/baremetal/deploy.yaml
#修改镜像
vi deploy.yaml
#将image的值改为如下值:
registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/ingress-nginx-controller:v0.46.0
# 检查安装的结果
kubectl get pod,svc -n ingress-nginx
# 最后别忘记把svc暴露的端口要放行
2、域名访问
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-host-bar
spec:
ingressClassName: nginx
rules:
- host: "hello.atguigu.com"
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: hello-server
port:
number: 8000
- host: "demo.atguigu.com"
http:
paths:
- pathType: Prefix
path: "/nginx" # 把请求会转给下面的服务,下面的服务一定要能处理这个路径,不能处理就是404
backend:
service:
name: nginx-demo ## java,比如使用路径重写,去掉前缀nginx
port:
number: 8000
3、路径重写
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.atguigu.com"
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: hello-server
port:
number: 8000
- host: "demo.atguigu.com"
http:
paths:
- pathType: Prefix
path: "/nginx(/|$)(.*)" # 把请求会转给下面的服务,下面的服务一定要能处理这个路径,不能处理就是404
backend:
service:
name: nginx-demo ## java,比如使用路径重写,去掉前缀nginx
port:
number: 8000
4、流量限制
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-limit-rate
annotations:
nginx.ingress.kubernetes.io/limit-rps: "1" #限流
spec:
ingressClassName: nginx
rules:
- host: "haha.atguigu.com"
http:
paths:
- pathType: Exact
path: "/"
backend:
service:
name: nginx-demo
port:
number: 8000
六、Higress(Ingress可视化)
1、安装
#使用helm安装(svc模式要改为:NodePort)
helm repo add higress.io https://higress.io/helm-charts
helm install higress -n higress-system higress.io/higress --create-namespace --render-subchart-notes --set higress-console.domain=console.higress.io
#获取控制台账户密码
export ADMIN_USERNAME=$(kubectl get secret --namespace higress-system higress-console -o jsonpath="{.data.adminUsername}" | base64 -d)
export ADMIN_PASSWORD=$(kubectl get secret --namespace higress-system higress-console -o jsonpath="{.data.adminPassword}" | base64 -d)
echo -e "Username: ${ADMIN_USERNAME}\nPassword: ${ADMIN_PASSWORD}"
#查看对外的端口
[root@cluster-endpoint ~]# kubectl get svc -n higress-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
higress-console NodePort 10.96.211.150 <none> 8080:32304/TCP #控制台端口
higress-controller NodePort 10.96.30.248 <none> 8888:31766/TCP,15051:31447/TCP,15010:30463/TCP,15012:32216/TCP,443:31292/TCP,15014:30182/TCP 47h
higress-gateway NodePort 10.96.86.237 <none> 80:31776/TCP,443:31411/TCP
七、存储(Glusterfs、NFS、CephFS)
1、创建nfs主从
#nfs主节点
echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports
mkdir -p /nfs/data
systemctl enable rpcbind --now
systemctl enable nfs-server --now
#配置生效
exportfs -r
#从节点
showmount -e 172.31.0.4
#执行以下命令挂载 nfs 服务器上的共享目录到本机路径 /root/nfsmount
mkdir -p /nfs/data
mount -t nfs 172.31.0.4:/nfs/data /nfs/data
# 写入一个测试文件
echo "hello nfs server" > /nfs/data/test.txt
2、原生方式挂载
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-pv-demo
name: nginx-pv-demo
namespace: devops
spec:
replicas: 2
selector:
matchLabels:
app: nginx-pv-demo
template:
metadata:
labels:
app: nginx-pv-demo
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
volumes:
- name: html
nfs:
server: 172.31.0.4
path: /nfs/data/nginx-pv
3、pv&pvc
PV:持久卷(Persistent Volume),将应用需要持久化的数据保存到指定位置
PVC:持久卷申明(Persistent Volume Claim),申明需要使用的持久卷规格
创建pv
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv01-10m
spec:
capacity:
storage: 100M
accessModes:
- ReadWriteMany
storageClassName: nfs
nfs:
path: /nfs/data/01
server: 172.31.0.4
pvc创建与绑定
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: nginx-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 20Mi
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
4、ConfigMap(抽取应用配置,并且可以自动更新)
redis示例
#创建配置,redis配置保存到k8s的etcd
kubectl create cm rds-cof --from-file=config.conf
kubectl edit cm rds-cf -n devops (修改configmap),修改了CM,Pod里面的配置文件会跟着变
配置值未更改,因为需要重新启动 Pod 才能从关联的 ConfigMap 中获取更新的值
原因:我们的Pod部署的中间件自己本身没有热更新能力
apiVersion: v1
data: #data是所有真正的数据,key:默认是文件名 value:配置文件的内容
config.conf: |
requirepass rootroot
kind: ConfigMap
metadata:
creationTimestamp: "2023-07-28T08:34:24Z"
name: rds-cf
namespace: devops
resourceVersion: "482232"
uid: 1864f6dc-287d-4881-b063-21c7a0c28182
创建deployment
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: my-redis
name: my-redis
spec:
replicas: 2
selector:
matchLabels:
app: my-redis
template:
metadata:
labels:
app: my-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: rds-cf
items:
- key: config.conf #配置的文件名
path: redis.conf #容器中的文件名
5、Secret
ecret 对象类型用来保存敏感信息,例如密码、OAuth 令牌和 SSH 密钥。 将这些信息放在 secret 中比放在 Pod 的定义或者 容器镜像 中来说更加安全和灵活。
#创建
kubectl create secret docker-registry leifengyang-docker \
--docker-username=leifengyang \
--docker-password=Lfy123456 \
--docker-email=534096094@qq.com
##命令格式
kubectl create secret docker-registry regcred \
--docker-server=<你的镜像仓库服务器> \
--docker-username=<你的用户名> \
--docker-password=<你的密码> \
--docker-email=<你的邮箱地址>
使用
apiVersion: v1
kind: Pod
metadata:
name: private-nginx
spec:
containers:
- name: private-nginx
image: leifengyang/guignginx:v1.0
imagePullSecrets:
- name: leifengyang-docker
更多推荐
所有评论(0)