WSの小屋

虚拟机,容器和 K8S

虚拟机

像是租一间空房,租完以后还要自行布置家具。

容器

像是领包入住,租的房子已经有了家具,不需要自己布置了。想要厨房就租有厨房的,不想要也可以找没有厨房的。

K8S

像是酒店式公寓,经由前台的服务,可以方便快速的租房退房换房等。

Cluster、Node、Pod

Cluster

Kubernetes 把多个资源关联起来运行应用,这一堆资源合起来就叫做 Cluster,集群。

Node

提供资源的服务器或是虚拟机,即为 Node,节点。

Pod

存放容器的单位,类似于豆荚(Pod)和豆子(容器)的关系。

Minikube

Minikube

Windows 安装 Docker Desktop 搭建 K8S 学习环境

下载安装 Docker Desktop

Docker Desktop

安装后打开闪退报错 Unexpected WSL error

尝试以管理员身份运行 cmd:

bash 复制代码
wsl --update
netsh winsock reset
wsl --shutdown

开启 K8S

随后 cmd 中输入kubectl

安装成功!

kubectl

常用命令

  • create 创建资源

  • expose 将资源暴露为新的 Kubernetes Service

  • run 运行镜像

  • set 直接动态调整属性

  • explain 描述各种资源的字段和结构

  • get 获取资源

  • edit 直接在现有的资源对象基础上,修改 xx 属性

  • delete 删除资源

  • rollout 部署和回滚

  • scale 扩缩容,直接动态调整数量

  • describe 限定特定资源的详细信息

  • logs 打印 pod 中容器的日志

  • exec 在某个容器中执行一个命令

  • apply 基于资源清单文件,把资源创建出来

bash 复制代码
kubectl get xxx
kubectl delete xxx xxxname
kubectl create -f xxxpath
kubectl replace -f xxxpath
kubectl apply -f xxxpath

例如

bash 复制代码
# 查看pods
kubectl get pods
# 删除pod
kubectl delete pod podName
# 通过配置文件创建(可以是pod、ReplicaSet、deployment、service等)
kubectl create -f config.yml

Pod

Pod 是 Kubernets 可以调度的最小对象

命令创建:

bash 复制代码
kubectl run my-nginx --image=k8s-register.com/wsvaio/nginx:1.25.4
# 查看预期状态 转为资源文件
kubectl run my-nginx --image=k8s-register.com/wsvaio/nginx:1.25.4 --dry-run=client -o yaml
# 查看实际状态 转为资源文件
kubectl get my-nginx -o yaml

配置文件:

yml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
    - name: nginx-container
      image: nginx

随后可以使用 kubectl 命令创建 pod:

bash 复制代码
# 创建
kubectl create -f pod.yml
# 查看pods
kubectl get pods

ReplicaSet

译为副本集,主要用于维持一定数量的 pod 可以运行

配置文件:

yml 复制代码
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-replicaset
  labels:
    name: nginx-replica
spec:
  replicas: 8
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      name: nginx-pod
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx-container
          image: nginx

随后可以使用 kubectl 命令创建 ReplicaSet:

bash 复制代码
# 创建
kubectl create -f ReplicaSet.yml
# 查看ReplicaSets,rs即为ReplicaSet
kubectl get rs

deployment

Deployment 就是更高级的 ReplicaSet,创建 Deployment 的时候会创建 ReplicaSet

配置文件:

yml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    name: nginx-deploy
spec:
  replicas: 4
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      name: nginx-pod
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx-container
          image: nginx:1.25.3

随后可以使用 kubectl 命令创建 Deployment:

bash 复制代码
# 创建
kubectl create -f deployment.yml
# 查看deployments
kubectl get deployments
# 更新deployments
kubectl apply -f deployment.yml

service

应用间的交互或对外暴露服务需要用到 service

  • ClusterIP 在集群内分配 IP 地址,这个 IP 只能在集群内部使用
  • NodePort 让节点暴露端口,使得外部可以访问内部的应用
  • LoadBalancer
  • ExternalName

命令创建:

bash 复制代码
kubectl expose deployment my-tomcat --port=8080

配置文件(NodePort 暴露一个端口给外部访问):

yml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: external-service
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
    - port: 80 # service 端口号
      targetPort: 80 # pod中应用的端口号
      nodePort: 30008 # 节点暴露的端口号(30000-32767)

随后可以使用 kubectl 命令创建 service:

bash 复制代码
# 创建
kubectl create -f service.yml
# 查看services,默认有一个kubernetes的service
kubectl get services

volume

  • emptyDir
yaml 复制代码
volumes:
  - name: volume_name
    emptyDir: {}
  • hostPath
yaml 复制代码
volumes:
  - name: volume_name
    hostPath:
      path: /path/to/host
  • NFS
yaml 复制代码
volumes:
  - name: redis-backup
    nfs:
      server: NFS_SERVER
      path: /path/to/nfs-dir
  • PV
yaml 复制代码
apiVersion: v1
kind: PersistentVolume
metadata:
  name: superopsmsb-pv
spec:
  capacity:
    storage: 3Gi
  accessModes:
    - ReadWriteOnce
  nfs:
    path: /superopsmsb/nfs-data
    server: 10.0.0.18
  • PVC
yaml 复制代码
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: superopsmsb-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  • SC
yaml 复制代码
storageClassName: storageclass
yaml 复制代码
apiVersion: apps/v1
kind: StatefulSet
spec:
  volumeClaimTemplates:
    - metadata:
      spec:
        storageClassName: storageclass
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 100Mi

ConfigMap

bash 复制代码
# 创建cm资源对象
kubectl create configmap nginx-ssl-conf --from-file=nginx-conf-tls/
yaml 复制代码
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-nginx-index
data:
  index.html: "Hello Nginx, I'am just fool for you !"

Secret

bash 复制代码
kubectl create secret tls nginx-ssl-secret --cert=tls.crt --key=tls.key
yaml 复制代码
apiVersion: v1
kind: Secret
type: kubernetes.io/tls
metadata:
  name: nginx-ssl-secret
data:
  tls.crt: xxx
  tls.key: xxx

感谢

【入门篇】Kubernetes 的核心概念以及在本地部署多种资源
马士兵全套Kubernetes(K8S)入门+项目实战,一个视频带你彻底掌握K8S核心能力!

Comments | 0条评论