Kubernetes的日常使用

一、名称空间(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还有 StatefulSetDaemonSetJob 等 类型资源。我们都称为 工作负载

有状态应用使用 StatefulSet 部署,无状态应用使用 Deployment 部署

工作负载资源 | Kubernetes

四、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  

  • 16
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值