k8s快速上手(docker版minikube)

这篇具有很好参考价值的文章主要介绍了k8s快速上手(docker版minikube)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

云原生系列:https://cloud.tencent.com/developer/column/96871

一.docker安装

下载地址: https://dockerdocs.cn/docker-for-windows/install

windows程序和功能启动 (适用于Linux的Windows子系统,虚拟机平台)

升级WSL2:https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi

//删除旧的linux子系统(可选)
wsl --unregister Legacy	

//查看可选的linux发行版
wsl --list --online(wsl -l -o)

//安装一个特定版本
wsl --install -d Ubuntu-20.04

//查看版本
wsl -l -v

//升级wsl
wsl -s Ubuntu-22.04 2

docker-desktop中启用ubuntu

进入子系统盘符
\\wsl$
二.安装minikube

在ubuntu子系统中安装

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

查看版本信息

minikube version

启动看k8s集群

minikube start --kubernetes-version=v1.23.8 --registry-mirror=https://registry.docker-cn.com --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --driver=docker

//重新安装版本
minikube delete
minikube start --kubernetes-version=v1.23.8

minikube start --kubernetes-version=v1.23.8 --image-mirror-country='cn' --image-repository='registry.cn-hangzhou.aliyuncs.com/google_containers'

使用

# 启动集群
minikube start
# 查看节点。kubectl 是一个用来跟 K8S 集群进行交互的命令行工具
kubectl get node
# 停止集群
minikube stop
# 清空集群
minikube delete --all
# 安装集群可视化 Web UI 控制台
minikube dashboard

查看状态
minikube status

实践

运行nginx容器
kubectl run nginx-deployment --image=nginx:1.14 --port=80	//使用run不支持多副本,被废弃
多实例可以使用
kubectl create deployment nginx --image=nginx --port=80 --replicas=3

查看pod: kubectl get pod,用来查看使用命令创建的所有实例
查看deploy:kubectl get deploy,用来查看实例所创建的数量

暴露服务
kubectl expose deployment nginx --port=80 --target-port=80 --name=nginx --type=NodePort

修改版本
kubectl set image deployment/nginx nginx=nginx:1.15

查看相关的后端节点
kubectl get endpoints

详细描述
kubectl describe svc nginx

kubectl describe svc nginx | grep NodePort

//获取服务运行地址
minikube service nginx

//监听pod状态
kubectl get pods -w

//查看历史版本
kubectl rollout history deployment/nginx

//滚动规则(RollingUpdateStrategy:  25% max unavailable, 25% max surge)
kubectl describe deployment nginx

//执行回滚到上一个版本
kubectl rollout undo deployment/nginx
kubectl get pods -o wide

//回滚到具体版本
kubectl rollout undo deployment/nginx --to-revision=2

//删除副本控制器
kubectl delete deployment nginx

//删除svc
kubectl delete service nginx

三.StatefulSet

StatefulSet 是用来管理有状态的应用,例如数据库。
前面我们部署的应用,都是不需要存储数据,不需要记住状态的,可以随意扩充副本,每个副本都是一样的,可替代的。
而像数据库、Redis 这类有状态的,则不能随意扩充副本。
StatefulSet 会固定每个 Pod 的名字

特性

  • Service 的 CLUSTER-IP 是空的,Pod 名字也是固定的。
  • Pod 创建和销毁是有序的,创建是顺序的,销毁是逆序的。
  • Pod 重建不会改变名字,除了IP,所以不要用IP直连

创建statefulSet的mongodb

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mongodb
spec:
  serviceName: mongodb
  replicas: 3
  selector:
    matchLabels:
      app: mongodb
  template:
    metadata:
      labels:
        app: mongodb
    spec:
      containers:
        - name: mongo
          image: mongo:4.4
          # IfNotPresent 仅本地没有镜像时才远程拉,Always 永远都是从远程拉,Never 永远只用本地镜像,本地没有则报错
          imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata:
  name: mongodb
spec:
  selector:
    app: mongodb
  type: ClusterIP
  # HeadLess
  clusterIP: None
  ports:
    - port: 27017
      targetPort: 27017

kubectl apply -f mongo.yaml

查看endpoints:kubectl get endpoints mongodb -o yaml

发现多一个hostname

访问时,如果直接使用 Service 名字连接,会随机转发请求
要连接指定 Pod,可以这样pod-name.service-name
运行一个临时 Pod 连接数据测试下
kubectl run mongodb-client --rm --tty -i --restart='Never' --image docker.io/bitnami/mongodb:4.4.10-debian-10-r20 --command -- bash

进入mongodb-client

kubectl exec -it mongodb-client – bash

连接其中一个mongodb

mongo 10.244.0.14 (ip在endpoints中查看)

基本操作验证

1.创建或使用数据库
use go
2.查询当前所在数据库
db
3.查看所有数据库,创建的数据库没有数据是看不到的
show dbs
4.删除数据库
db.dropDatabase()

5.创建集合
db.createCollection(name, options)

capped	布尔	(可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。
当该值为 true 时,必须指定 size 参数。
size	数值	(可选)为固定集合指定一个最大值,即字节数。
如果 capped 为 true,也需要指定该字段。
max	数值	(可选)指定固定集合中包含文档的最大数量。

创建固定集合,最大1000
db.createCollection('web', {capped:true, size:1000})

6.查看集合
show collections/show tables

7.删除集合
db.集合名.drop()

8.插入数据
db.集合名.insert(document) 或 db.集合名.save(document)
db.集合名.insert({'name':'lisi', 'age':4})

9.查询数据
db.集合名.find(query, projection)
db.集合名.findOne(query, projection)

query :可选,使用查询操作符指定查询条件
projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。

//年龄大于或等于18
db.集合名.find({age:{$gte:18}})

四.数据持久化

kubernetes 集群不会为你处理数据的存储,我们可以为数据库挂载一个磁盘来确保数据的安全。
你可以选择云存储、本地磁盘、NFS。

  • 本地磁盘:可以挂载某个节点上的目录,但是这需要限定 pod 在这个节点上运行
  • 云存储:不限定节点,不受集群影响,安全稳定;需要云服务商提供,裸机集群是没有的。
  • NFS:不限定节点,不受集群影响

hostPath 挂载示例

把节点上的一个目录挂载到 Pod,但是已经不推荐使用了,文档
配置方式简单,需要手动指定 Pod 跑在某个固定的节点。
仅供单节点测试使用;不适用于多节点集群。
minikube 提供了 hostPath 存储,文档

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mongodb
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mongodb
  serviceName: mongodb
  template:
    metadata:
      labels:
        app: mongodb
    spec:
      containers:
        - name: mongo
          image: mongo:4.4
          # IfNotPresent 仅本地没有镜像时才远程拉,Always 永远都是从远程拉,Never 永远只用本地镜像,本地没有则报错
          imagePullPolicy: IfNotPresent
          volumeMounts:
              - name: mongo-data    # 卷名字,必须跟下面定义的名字一致
              mountPath: /data/db # 容器里面的挂载路径
      volumes:
        - name: mongo-data              # 卷名字
          hostPath:
            path: /data/mongo-data      # 节点上的路径
            type: DirectoryOrCreate     # 指向一个目录,不存在时自动创建

使用本地磁盘示例

https://cloud.tencent.com/developer/article/2137392

创建pv

描述卷的具体信息,例如磁盘大小,访问模式

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mongodata
spec:
  capacity:
    storage: 2Gi
  volumeMode: Filesystem  # Filesystem(文件系统) Block(块)
  accessModes:
    - ReadWriteOnce       # 卷可以被一个节点以读写方式挂载
  persistentVolumeReclaimPolicy: Delete
  storageClassName: local-storage
  local:
    path: /root/data
  nodeAffinity:
    required:
      # 通过 hostname 限定在某个节点创建存储卷
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
                - node2

创建pvc

对存储需求的一个申明,可以理解为一个申请单,系统根据这个申请单去找一个合适的 PV

还可以根据 PVC 自动创建 PV。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mongodata
spec:
  accessModes: ["ReadWriteOnce"]
  storageClassName: "local-storage"
  resources:
    requests:
      storage: 2Gi

应用yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mongodb
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mongodb
  serviceName: mongodb
  template:
    metadata:
      labels:
        app: mongodb
    spec:
      containers:
        - name: mongo
          image: mongo:4.4
          # IfNotPresent 仅本地没有镜像时才远程拉,Always 永远都是从远程拉,Never 永远只用本地镜像,本地没有则报错
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - mountPath: /data/db # 容器里面的挂载路径
              name: mongo-data    # 卷名字,必须跟下面定义的名字一致
      volumes:
        - name: mongo-data              # 卷名字
          hostPath:
            path: /data/mongo-data      # 节点上的路径
            type: DirectoryOrCreate     # 指向一个目录,不存在时自动创建
       
-----
apiVersion: v1
kind: Service
metadata:
  name: mongodb
spec:
  selector:
    app: mongodb
  type: ClusterIP
  # HeadLess
  clusterIP: None
  ports:
    - port: 27017
      targetPort: 27017

验证:

进入容器确定是否有数据docker exec -it minikube /bin/sh

cd /data/mongo-data

通过前面的客户端的操作,发现minukube节点的mongo-data中的数据和mongodb-client中的数据同步一致

五.ConfigMap & Secret

数据库连接地址,这种可能根据部署环境变化的,我们不应该写死在代码里。
Kubernetes 为我们提供了 ConfigMap,可以方便的配置一些变量。文档

创建configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: mongo-config
data:
  mongoHost: mongodb-0.mongodb:27017
# 应用
kubectl apply -f configmap.yaml
# 查看
kubectl get configmap mongo-config -o yaml

创建secret.yaml

一些重要数据,例如密码、TOKEN,我们可以放到 secret 中。文档,配置证书

apiVersion: v1
kind: Secret
metadata:
  name: mongo-secret
# Opaque 用户定义的任意数据,更多类型介绍 https://kubernetes.io/zh/docs/concepts/configuration/secret/#secret-types
type: Opaque
data:
  # 数据要 base64。https://tools.fun/base64.html
  mongo-username: bW9uZ291c2Vy
  mongo-password: bW9uZ29wYXNz
# 应用
kubectl apply -f secret.yaml
# 查看
kubectl get secret mongo-secret -o yaml

作为环境变量使用

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mongodb
spec:
  replicas: 3
  selector:
    matchLabels:
      app: mongodb
  template:
    metadata:
      labels:
        app: mongodb
    spec:
      containers:
        - name: mongo
          image: mongo:4.4
          # IfNotPresent 仅本地没有镜像时才远程拉,Always 永远都是从远程拉,Never 永远只用本地镜像,本地没有则报错
          imagePullPolicy: IfNotPresent
          env:
          - name: MONGO_INITDB_ROOT_USERNAME
            valueFrom:
              secretKeyRef:
                name: mongo-secret
                key: mongo-username
          - name: MONGO_INITDB_ROOT_PASSWORD
            valueFrom:
              secretKeyRef:
                name: mongo-secret
                key: mongo-password
          - name: MONGO_ADDRESS
            valueFrom:
           	  configMapKeyRef:
                name: mongo-config
                key: mongoHost
          # Secret 的所有数据定义为容器的环境变量,Secret 中的键名称为 Pod 中的环境变量名称
          # envFrom:
          # - secretRef:
          #     name: mongo-secret
进入容器验证
kubectl exec -it mongodb-0 -- bash
echo $MONGO_INITDB_ROOT_USERNAME
echo $MONGO_INITDB_ROOT_PASSWORD
echo $MONGO_ADDRESS

kubectl exec -it mongodb-client -- bash
mongo --host mongodb-0.mongodb
use test
db.users.find()		//报没有权限

//使用账号密码就有权限操作
mongo --host mongodb-0.mongodb -u mongouser -p mongopass

挂载为文件(更适合证书文件)

挂载后,会在容器中对应路径生成文件,一个 key 一个文件,内容就是 value,文档

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mypod
    image: redis
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
      readOnly: true
  volumes:
  - name: foo
    secret:
      secretName: mysecret
六.Helm和命名空间

后续补充文章来源地址https://www.toymoban.com/news/detail-528697.html

到了这里,关于k8s快速上手(docker版minikube)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • kubernetes(k8s)大白学习02:容器和docker基础、使用、架构学习

    简单说:容器(container)就是计算机上的一个沙盒进程,它与计算机上的所有其它进程相隔离。 这种隔离是怎么做到的呢?它利用了内核提供的 namespace 和 cgroup 这 2 种技术。这些技术能力在 Linux 中已经存在了很长时间。而 Docker 或容器技术致力于将这些功能更易于使用和更

    2024年02月07日
    浏览(69)
  • Kubernetes(K8s)从入门到精通系列之十六:linux服务器安装minikube的详细步骤

    安装Docker的详细步骤,可以阅读博主下面这篇技术博客文章:

    2024年02月12日
    浏览(57)
  • 云原生Kubernetes:K8S集群实现容器运行时迁移(docker → containerd) 与 版本升级(v1.23.14 → v1.24.1)

    目录 一、理论 1.K8S集群升级 2.环境 3.升级策略 4.master1节点迁移容器运行时(docker → containerd)  5.master2节点迁移容器运行时(docker → containerd)  6.node1节点容器运行时迁移(docker → containerd)  7.升级集群计划(v1.23.14 → v1.24.1) 8.升级master1节点版本(v1.24.1) 9.升级master2节点版本

    2024年02月03日
    浏览(69)
  • (详细步骤+各项报错处理)windows11 安装Docker和部署K8S单节点(minikube)

    (1)win11系统(win10应该也可以,但没试过) (2)保证cpu虚拟化开启 (3)主机要留有一定的内存 满足以上即可安装docker desktop版本 (1)获取Docker Desktop并安装Download For Windows(使用了WSL2技术,直接可以在windows上运行,不需要额外的虚拟化环境) (2)开始安装,按照安装向

    2024年02月03日
    浏览(41)
  • 极速上手k8s,Kubernetes 从入门到摸鱼系列-理论篇

    大家好,我是比特桃!随着微服务架构越来越流行,大规模的微服务容器编排成了一件具有挑战的事情。在这次容器化云原生的发展中,Docker 成了容器化的赢家,而 Kubernetes 则成为了容器编排的赢家。k8s 是 Kubernetes 的简称,只因为 K 和 s 中间有8个字符。或许你还会看到 k3

    2024年02月13日
    浏览(58)
  • 容器化进阶Kubernetes(K8S)详解

    1.1.1 Kubernetes是什么及作用 Kubernetes(K8S)是Google在2014年发布的一个开源项目,用于自动化容器化应用程序的部署、扩展和管理。 Kubernetes通常结合docker容器工作,并且整合多个运行着docker容器的主机集群。 官网地址 Kubernetes 中文社区 Kubernetes(k8s)中文文档 目录_Kubernetes中文社

    2024年02月05日
    浏览(78)
  • 极速上手k8s,Kubernetes 从入门到摸鱼系列-实践篇

    大家好,我是比特桃。本文为《极速上手k8s,Kubernetes 从入门到摸鱼系列》的实战篇,旨在快速上手k8s。如没有阅读过k8s相关理论的朋友,可以先阅读理论篇。 k8s 的意义在于分布式大规模容器编排,所以如果我们想要在实际中发挥它的最大价值,至少也得需要 3 台机器。其中

    2024年02月16日
    浏览(45)
  • 快速搭建Kubernetes (K8S)平台

    kubernetes是Google 2014年创建并管理,是Google 10多年大规模容器管理技术Borg的开源版本。它是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。 通过Kubernetes你可以:     快速部署应用     快速扩展应用     无缝对接新

    2024年02月02日
    浏览(54)
  • Kubernetes(K8s):容器化应用的航空母舰

    Kubernetes(K8s)是一个开源的容器编排系统,它的出现就像是为容器化应用提供了一艘强大的航空母舰。在这艘母舰上,你的应用容器就像是一架架战斗机,Kubernetes负责指挥它们起飞、飞行、降落,确保它们能在正确的时间、正确的地点执行任务。 Pod: Kubernetes的基本飞行编队

    2024年04月08日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包