# kubernetes

# 介绍

Kubernetes(通常简称为K8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。

# namespace

命名空间

# 作用:

  • 资源隔离:不同的团队或项目可能需要不同的资源配额或安全策略。通过将资源分配到不同的命名空间,可以确保这些资源在逻辑上是隔离的。
  • 权限控制:Kubernetes使用基于角色的访问控制(RBAC)来管理权限。命名空间是RBAC策略的一个关键组成部分,允许你定义哪些用户可以访问或修改哪些命名空间中的资源。
  • 资源配额:你可以为命名空间设置资源配额,以限制其中所有Pod可以使用的CPU、内存等资源量。

# pod

pod是k8s中最小单元,可以运行一组一个或多个容器

#部署
kubectl run mynginx --image=nginx:1.14.2
#查看ip
kubectl get pod -owide

# deployment

负责创建和更新应用程序的实例,使Pod拥有多副本,自愈,扩缩容能力。

# 自愈能力

kubectl create deployment my-tomcat--image=tomcat:9.0.55

# 多副本

# 参数:--replicas

#命令行方式
kubectl create deployment my-tomcat--image=tomcat:9.0.55 --replicas=3

#脚本方式
vim my-tomcat.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: my-tomcat
  name: my-tomcat
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-tomcat
  template:
    metadata:
      labels:
        app: my-tomcat
    spec:
      containers:
      - image: tomcat:9.0.55
        name: tomcat

#运行
kubectl apply -f my-tomcat.yaml
#查看
kubectl get pod
#删除
kubectl delete deployment my-tomcat

# 扩缩容

# 参数:scale

#扩容到5个pod
kubectl scale --replicas=5 deployment my-tomcat
#扩容到3个pod
kubectl scale --replicas=3 deployment my-tomcat

# 升级回滚

# 升级

#升级到10.1.11版本
kubectl set image deployment my-tomcat tomcat=tomcat:10.1.11 --record

#查看pod升级详情
kubectl describe pod my-tomcat-75794467bc-9frnk

image-20240528113113630

#查看历史版本
kubectl rollout history deploy my-tomcat

image-20240528113437987

# 回滚

#回滚到上一个版本
kubectl rollout undo deployment my-tomcat
#回滚到指定版本
kubectl rollout undo deployment my-tomcat --to-revision=1
#查看pod回滚详情
kubectl describe pod my-tomcat-7f776c8676-4ftkj

# service

Service 是一个微服务应用或者一组Pod的访问策略,提供服务发现和负载均衡

type类型:

ClusterIP(默认):只能在集群内访问

NodePort:公网访问

LoadBalancer:负载均衡

ExtemalName:带名称的,公开service

#命令行方式
kubectl expose deployment my-tomcat --name=tomcat --port=8080 --type=NodePort

#脚本方式
vim mytomcat-service.yaml

apiVersion: v1
kind: Service
metadata:
  labels:
    app: my-tomcat
  name: my-tomcat
spec:
  ports:
    - port: 8080
      nodePort: 30001
      protocol: TCP
      targetPort: 8080
  type: NodePort
  selector:
    # 标签选择器由 name 修改为 app
    app: my-tomcat

#运行
kubectl apply -f mytomcat-service.yaml
#查看
kubectl get service
#删除
kubectl delete service my-tomcat

port:服务在集群内部暴露的端口,在集群内通过虚拟ip加该端口访问服务。 targetPort:Pod暴漏的端口,与Pod内部暴漏的端口一致 nodePort:是集群外部访问服务的一种方式,通过在所有节点上开放一个端口来实现。

#服务内访问通过内网ip
curl 10.102.235.142:8080

image-20240528142010718

#外网访问
http://172.17.110.249:30001

image-20240528142420560

# volume(数据卷)

基于nfs分布式文件系统实现,参考(nfs分布式文件系统)

# ConfigMap

配置中心

将公共的配置存到etcd中,敏感信息用secret存储

存储方式4种:

# --from-literal     字面值方式

kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2

# --from-file        文件方式
kubectl create configmap my-config-2 --from-file=/etc/resolv.conf

#3 目录方式
mkdir test  
cp /etc/passwd test/  
cp /etc/fstab test/  
kubectl create configmap my-config-3 --from-file=test

#4 YAML文件
vim cm1.yaml


apiVersion: v1  
kind: ConfigMap  
metadata:  
  name: cm1-config  
data:  
  db_host: "172.25.0.250"  
  db_port: "3306"

kubectl apply -f cm1.yaml

#设置 redis.conf
vim redis.conf

maxmemory-policy allkeys-lru
requirepass root

#创建 configmap
kubectl create cm redis-config --from-file=redis.conf

#查看
kubectl get cm

#删除
kubectl delete cm redis-config

#脚本方式
vim redis-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: redis
spec:
  containers:
  - name: redis
    image: redis
    command:
      - redis-server
      - "/redis-master/redis.conf"  # redis容器内部位置
    env:
    - name: MASTER
      value: "true"
    ports:
    - containerPort: 6379
    volumeMounts:
    - mountPath: /data
      name: data
    - mountPath: /redis-master
      name: config
  volumes:
    - name: data
      emptyDir: {}
    - name: config
      configMap:
        name: redis-config
        items:
        - key: redis.conf
          path: redis.conf

#运行
kubectl apply -f redis-pod.yaml
#查看
kubectl get pod
kubectl describe pod redis
#删除
kubectl delete pod redis

#验证是否生效
kubectl exec -it redis -- redis-cli
#授权
auth root
#查看redis.conf配置的key
config get requirepass

image-20240529115327585

# secret

敏感信息存储,如token,密码等

#查看secret
kubectl get secret
kubectl delete secret alikey


#创建secret(alikey)
kubectl create secret docker-registry alikey --docker-server=[镜像仓库服务器] --docker-username=[用户名] --docker-password=[密码] --docker-email=[邮箱地址]

--镜像仓库服务器 registry.cn-beijing.aliyuncs.com

#记得先设置阿里上docker的密码,否则会导致无法登录
kubectl create secret docker-registry alikey \
--docker-server=registry.cn-beijing.aliyuncs.com \
--docker-username=[用户名] \
--docker-password=[密码] \
--docker-email=573122954@qq.com


#脚本方式
vim secret-dream.yaml

apiVersion: v1
kind: Pod
metadata:
  name: dream
spec:
  containers:
  - name: dream
    image: registry.cn-beijing.aliyuncs.com/meteorplan/dream:2.0
  imagePullSecrets:
  - name: alikey

#运行
kubectl apply -f secret-dream.yaml
#查看
kubectl get pod
kubectl describe pod dream

kubectl delete pod dream

# Ingress

k8s对外的入口,可以配置路由规则,通过Ingress转发到service

参考(ubuntu文档的-ingress)

# Spring Cloud Kubernetes(待补充)

实现微服务的服务发现与注册,配置管理,弹性伸缩与负载均衡,监控与日志,安全性与隔离性

功能与k8s功能一样,社区不完善