使用Minikube+docker+harbor+k8s自动化部署 @by_TWJ

目录

  • [1. 开始](#1. 开始)
    • [1.1. 环境](#1.1. 环境)
    • [1.2. 测试的git仓库](#1.2. 测试的git仓库)
    • [1.3. 离线文件](#1.3. 离线文件)
    • [1.4. 安装docker](#1.4. 安装docker)
    • [1.5. 安装docker-compose(非必要)](#1.5. 安装docker-compose(非必要))
    • [1.6. 安装Jenkins](#1.6. 安装Jenkins)
    • [1.7. 安装harbor](#1.7. 安装harbor)
    • [1.8. 允许docker通过http访问私有仓库](#1.8. 允许docker通过http访问私有仓库)
    • [1.9. 修改/etc/hosts,追加自定义域名](#1.9. 修改/etc/hosts,追加自定义域名)
    • [1.10. 安装Minikube](#1.10. 安装Minikube)
  • [2. minikube使用driver=docker方式](#2. minikube使用driver=docker方式)
  • [3. minikube使用driver=none方式](#3. minikube使用driver=none方式)
    • [3.1. 安装minikube前提](#3.1. 安装minikube前提)
      • [3.1.1. cri-docker安装](#3.1.1. cri-docker安装)
      • [3.1.2. containernetworking-plugins 安装](#3.1.2. containernetworking-plugins 安装)
      • [3.1.3. 安装 conntrack-tools](#3.1.3. 安装 conntrack-tools)
      • [3.1.4. 安装crictl](#3.1.4. 安装crictl)
      • [3.1.5. 安装which](#3.1.5. 安装which)
      • [3.1.6. 安装socat](#3.1.6. 安装socat)
      • [3.1.7. 禁用swap](#3.1.7. 禁用swap)
    • [3.2. 安装成功后](#3.2. 安装成功后)
      • [3.2.1. 安装时的问题](#3.2.1. 安装时的问题)
      • [3.2.2. 设置别名 kubectl](#3.2.2. 设置别名 kubectl)
      • [3.2.3. 安装minikube-dashboard](#3.2.3. 安装minikube-dashboard)
      • [3.2.4. 给apiservice配置代理外网访问(含minikube-dashboard)](#3.2.4. 给apiservice配置代理外网访问(含minikube-dashboard))
  • [4. 外部端口之间通讯](#4. 外部端口之间通讯)
    • [4.1. 使用 port-forward(临时用)](#4.1. 使用 port-forward(临时用))
    • [4.2. 使用Pod提供的外部访问端口](#4.2. 使用Pod提供的外部访问端口)
    • [4.3. 使用 ingress提供的外部访问端口转发](#4.3. 使用 ingress提供的外部访问端口转发)
      • [4.3.1. 安装ingress](#4.3.1. 安装ingress)
      • [4.3.2. 例子1:](#4.3.2. 例子1:)
      • [4.3.3. 例子2:](#4.3.3. 例子2:)
  • [5. 内部端口之间通讯](#5. 内部端口之间通讯)
    • [5.1. Pod 不会与Pod之间通讯](#5.1. Pod 不会与Pod之间通讯)
    • [5.2. service之间通讯](#5.2. service之间通讯)
      • [5.2.1. 例子](#5.2.1. 例子)
  • [6. 挂载卷](#6. 挂载卷)
  • [7. StatefulSet](#7. StatefulSet)
  • [8. 补充语句](#8. 补充语句)
  • [9. 部署项目](#9. 部署项目)
    • [9.1. 部署springboot项目](#9.1. 部署springboot项目)
      • [9.1.1. 流程](#9.1.1. 流程)
  • [9. 术语](#9. 术语)

1. 开始

建议使用driver=none方式

1.1. 环境

系统:archlinux

k8s版本:1.30.0

1.2. 测试的git仓库

复制代码
https://gitee.com/alvis128/demo.git
https://gitee.com/alvis128/demo2.git

1.3. 离线文件

复制代码
链接:https://pan.baidu.com/s/1G0mhdUhd0HmphZnlva2prg 
提取码:ue70

1.4. 安装docker

shell 复制代码
# 安装docker
sudo pacman -S docker
# 配置自启动服务,并立即启动docker
sudo systemctl enable --now docker
# 赋予当前用户docker权限
sudo usermod -aG docker $USER
newgrp docker

docker 配置源

/etc/docker 目录可能不存在,需要创建,所以运行命令:mkdir /etc/docker

shell 复制代码
nano /etc/docker/daemon.json
----------------------
{
 "registry-mirrors": [
    "http://hub-mirror.c.163.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://registry.docker-cn.com"
 ]
}
---------------------
# 更新daemon
systemctl daemon-reload
# 重启docker
systemctl restart docker
# 查看docker状态
systemctl status docker

1.5. 安装docker-compose(非必要)

shell 复制代码
# 安装docker-compose
sudo pacman -S docker-compose

1.6. 安装Jenkins

默认启动端口是:8090

shell 复制代码
sudo pacman -S jenkins
# 查看启动状态
systemctl status jenkins 
# 若没有启动,则运行命令启动
systemctl start jenkins

# 赋予当前用户(jenkins)docker权限
sudo usermod -aG docker jenkins
newgrp docker

额外:

jenkins切换用户执行

shell 复制代码
# 修改
nano /usr/lib/systemd/system/jenkins.service
-------------
user=tavion
-------------
chown -R tavion:tavion /usr/lib/jenkins
chown -R tavion:tavion /var/cache/jenkins
chown -R tavion:tavion /var/log/jenkins

1.7. 安装harbor

第一步、 下载并解压

github仓库:https://github.com/goharbor/harbor/releases

shell 复制代码
# 下载并解压
wget https://github.com/goharbor/harbor/releases/download/v2.11.0-rc1/harbor-offline-installer-v2.11.0-rc1.tgz
tar zxvf harbor-offline-installer-v2.11.0-rc1.tgz
# 上面解压后,会生成harbor目录,然后我们进入目录
cd harbor

第二步、配置harbor.yml

shell 复制代码
# 复制并改名
cp harbor.yml.tmpl harbor.yml
# 第二步、修改harbor.yml文件
nano harbor.yml
----------------------
# 注释https
# 修改hosthome为本地ip地址,也可以改为域名
----------------------

修改harbor.yml文件,我们测试环境不需要用https,所以注释掉,例如:

yml 复制代码
# 修改hostname
hostname: tavion.com

http:
  port: 8180
# 下面注释https
# https related config
# https:
  # https port for harbor, default is 443
  # port: 8181
  # The path of cert and key files for nginx
  # certificate: /home/vagrant/harbor/secret/ca.crt
  # private_key: /home/vagrant/harbor/secret/ca.key
  # enable strong ssl ciphers (default: false)
  # strong_ssl_ciphers: false

(后面略)

第三步、修改/etc/hosts,追加自定义域名

shell 复制代码
echo "127.0.0.1 tavion.com" >> /etc/hosts

第四步、导入harbor的images包

如果不导入,harbor会联网下载包,很慢的

shell 复制代码
docker load -i harbor.v2.11.0.tar.gz

第五步、安装harbor

shell 复制代码
./install.sh

1.8. 允许docker通过http访问私有仓库

第一种:通过修改daemon.json 方式(不推荐,因为重启后,会被其他程序修改)

shell 复制代码
# 修改/etc/docker/daemon.json ,修改结果如下:
vi /etc/docker/daemon.json
-----------------------------------------------

{
  "exec-opts": [
    "native.cgroupdriver=systemd"
  ],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "registry-mirrors": [
    "http://hub-mirror.c.163.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://registry.docker-cn.com"
  ],
  "insecure-registries": [
    "http://tavion.com:8380"
  ]
}
-----------------------------------------------
# 刷新daemon
systemctl daemon-reload
systemctl restart docker
# 查看docker是否正常运行,没问题
systemctl status docker

第二种: 通过在docker.service启动时添加例外

shell 复制代码
# 通过查看状态,找到docker服务执行类
systemctl status docker
# 修改服务
sudo nano /usr/lib/systemd/system/docker.service
------------------------------------------
# 修改成如下,在末尾添加例外 --insecure-registry=tavion.com
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry=tavion.com
------------------------------------------

1.9. 修改/etc/hosts,追加自定义域名

前面如果运行了,这里就不用运行了

shell 复制代码
echo "127.0.0.1 tavion.com" >> /etc/hosts

1.10. 安装Minikube

打开网址:https://minikube.sigs.k8s.io/docs/start/

根据提示安装Minikube

例如linux系统安装步骤:

shell 复制代码
# 下载并安装minikube程序
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube && rm minikube-linux-amd64

# 使用minikube部署k8s,安装很慢,因为网络问题,如下就是成功例子
minikube start  --kubernetes-version=v1.30.0  --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --driver=docker --memory=2048mb  --image-mirror-country='cn'
---------------------------------------------
* minikube v1.33.1 on Arch  (vbox/amd64)
* Using the docker driver based on user configuration
* Using image repository registry.cn-hangzhou.aliyuncs.com/google_containers
* Using Docker driver with root privileges
* Starting "minikube" primary control-plane node in "minikube" cluster
* Pulling base image v0.0.44 ...
! minikube was unable to download registry.cn-hangzhou.aliyuncs.com/google_containers/kicbase:v0.0.44, but successfully downloaded docker.io/kicbase/stable:v0.0.44 as a fallback image
* Creating docker container (CPUs=2, Memory=2048MB) ...
* Preparing Kubernetes v1.30.0 on Docker 26.1.1 ...
  - Generating certificates and keys ...
  - Booting up control plane ...
  - Configuring RBAC rules ...
* Configuring bridge CNI (Container Networking Interface) ...
* Verifying Kubernetes components...
  - Using image registry.cn-hangzhou.aliyuncs.com/google_containers/storage-provisioner:v5
* Enabled addons: storage-provisioner, default-storageclass
* kubectl not found. If you need it, try: 'minikube kubectl -- get pods -A'
* Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
---------------------------------------------
# 添加别名
alias kubectl="minikube kubectl --"
# 查看安装状态,如果安装成功,是全部都ready的,如下就是成功例子
kubectl get po -A
---------------------------------------------
NAMESPACE              NAME                                        READY   STATUS    RESTARTS       AGE
kube-system            coredns-7c445c467-5g2sl                     1/1     Running   1 (103s ago)   10m
kube-system            etcd-minikube                               1/1     Running   1 (108s ago)   11m
kube-system            kube-apiserver-minikube                     1/1     Running   1 (98s ago)    11m
kube-system            kube-controller-manager-minikube            1/1     Running   1 (108s ago)   11m
kube-system            kube-proxy-vnc94                            1/1     Running   1 (108s ago)   10m
kube-system            kube-scheduler-minikube                     1/1     Running   1 (108s ago)   11m
kube-system            storage-provisioner                         1/1     Running   2 (108s ago)   11m
kubernetes-dashboard   dashboard-metrics-scraper-b5fc48f67-28bf9   1/1     Running   1 (108s ago)   9m23s
kubernetes-dashboard   kubernetes-dashboard-779776cb65-2nqw4       1/1     Running   2 (94s ago)    9m23s
----------------------------------------------

2. minikube使用driver=docker方式

minikube 创建一个minikube的docker(1)容器,里面也有一个docker(2),服务都在这个docker(2)里执行

有缺陷:如果要添加私有仓库,需要进入到docker(2)里修改,且重启minikube后,docker(2)的修改内容丢失,这里的修改内容指的是私有仓库。不推荐使用

这里略,不推荐使用

3. minikube使用driver=none方式

部署简单

复制代码
minikube start  --kubernetes-version=v1.30.0  --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --driver=none --memory=2048mb  --image-mirror-country='cn'

3.1. 安装minikube前提

3.1.1. cri-docker安装

参考 https://mirantis.github.io/cri-dockerd/usage/install-manually/

  1. 下载二进制安装包
    打开网址,下载: https://github.com/Mirantis/cri-dockerd

下载后文件:cri-dockerd-0.3.14.amd64.tgz

解压: tar zxvf cri-dockerd-0.3.14.amd64.tgz

  1. 本地执行
shell 复制代码
git clone -b v0.3.14 --depth 1 https://github.com/Mirantis/cri-dockerd.git
  1. 进入cri-dockerd目录,并把二进制安装包cri-dockerd 放到cri-dockerd目录下

  2. 执行

shell 复制代码
install -o root -g root -m 0755 cri-dockerd /usr/local/bin/cri-dockerd
install packaging/systemd/* /etc/systemd/system
sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service
systemctl daemon-reload
systemctl enable --now cri-docker.socket

3.1.2. containernetworking-plugins 安装

参考 https://minikube.sigs.k8s.io/docs/faq/#how-do-i-install-containernetworking-plugins-for-none-driver

查看版本:

https://github.com/containernetworking/plugins/releases

v1.5.0 为例

shell 复制代码
mkdir -p /opt/cni/bin
tar -xf cni-plugins-linux-amd64-v1.5.0.tgz -C /opt/cni/bin

3.1.3. 安装 conntrack-tools

复制代码
pacman -S conntrack-tools

3.1.4. 安装crictl

复制代码
sudo pacman -S crictl

3.1.5. 安装which

复制代码
sudo pacman -S which

3.1.6. 安装socat

复制代码
 pacman -S socat

3.1.7. 禁用swap

shell 复制代码
# 临时禁用
sudo swapoff -a
# 永久关闭
sed -ri '/\sswap\s/s/^#?/#/' /etc/fstab

3.2. 安装成功后

3.2.1. 安装时的问题

shell 复制代码
minikube start  --kubernetes-version=v1.30.0  --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --driver=none --memory=2048mb  --image-mirror-country='cn'

这里一般都会有网络问题,如果失败,则重新安装。

复制代码
# 删除后,重新安装
minikube delete 

你也可以从我网盘里拿到minikube start...的离线安装文件: minikube_cache.tar.gz

你可以放置到~/.minikube 如下,然后继续minikube start...

shell 复制代码
mv minikube_cache.tar.gz ~/.minikube
tar zxvf minikube_cache.tar.gz

minikube start  --kubernetes-version=v1.30.0  --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --driver=none --memory=2048mb  --image-mirror-country='cn'

3.2.2. 设置别名 kubectl

shell 复制代码
# 修改/etc/profile 在最后添加如下
alias kubectl="minikube kubectl --"

# 更新
source /etc/profile

3.2.3. 安装minikube-dashboard

shell 复制代码
minikube dashboard

# 配置代理
kubectl proxy --port=45396 --address='0.0.0.0' --disable-filter=true --accept-hosts='^.*' &
# 游览器访问:
http://tavion.com:45396/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/#/ingressclass?namespace=default

3.2.4. 给apiservice配置代理外网访问(含minikube-dashboard)

复制代码
# 配置代理:这里我们配置后台执行,所以后面添加&: 
kubectl proxy --port=45396 --address='0.0.0.0' --disable-filter=true --accept-hosts='^.*' &

4. 外部端口之间通讯

4.1. 使用 port-forward(临时用)

shell 复制代码
# 配置映射外部端口
    # 查看Pods
    kubectl get pod
    --------------------------------
    NAME                    READY   STATUS    RESTARTS   AGE
    demo-79dfdd6f88-8c69f   1/1     Running   0          65m
    --------------------------------
    # 映射外部端口
    kubectl port-forward --address 0.0.0.0 demo-79dfdd6f88-8c69f 8190:8080
    # 游览器访问:
    curl http://localhost:8190/version

4.2. 使用Pod提供的外部访问端口

配置自定义的外部访问端口,需要在ports里添加hostPort外部访问端口

yml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: webapp 
  labels:
    app: webapp 
spec:
  # hostNetwork: true  		# 网络模式选择为使用宿主机网络,即容器所有的端口都会自动映射到宿主机上
  containers:
  - name: webapp
    image: tomat
    ports:
    - containerPort: 8080	# 容器的运行端口为 8080
      hostPort: 8081 		# 映射到宿主机的端口为 8081,如果上边设置了网络模式,则不需要加 hostPort
    # command: ['sh', '-c', 'echo The app is running! && sleep 3600']
shell 复制代码
minikube kubectl -- apply -f webapp-pod.yaml

4.3. 使用 ingress提供的外部访问端口转发

这种只提供80端口和443端口,内置nginx,通过nginx转发请求。如下:

4.3.1. 安装ingress

shell 复制代码
minikube addons enable ingress --images="KubeWebhookCertgenCreate=google_containers/kube-webhook-certgen:v20230407,KubeWebhookCertgenPatch=google_containers/kube-webhook-certgen:v20230407,IngressController=google_containers/nginx-ingress-controller:v1.8.1" --registries="IngressController=registry.cn-hangzhou.aliyuncs.com,KubeWebhookCertgenCreate=registry.cn-hangzhou.aliyuncs.com,KubeWebhookCertgenPatch=registry.cn-hangzhou.aliyuncs.com"

安装成功后,查看状态:

shell 复制代码
kubectl get pod -n ingress-nginx
----------------------------------
NAME                                        READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-29nfv        0/1     Completed   0          146m
ingress-nginx-admission-patch-5dmvr         0/1     Completed   1          146m
ingress-nginx-controller-77b5c5fcc6-wpgzf   1/1     Running     0          146m

----------------------------------

4.3.2. 例子1:

shell 复制代码
kubectl get svc -n ingress-nginx -owide

demo-ingress.yaml

yml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo-ingress
  annotations:
    # 指定 Ingress Controller 的类型
    kubernetes.io/ingress.class: "nginx"
    # 指定我们的 rules 的 path 可以使用正则表达式
    nginx.ingress.kubernetes.io/use-regex: "true"
    # 连接超时时间,默认为 5s
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "600"
    # 后端服务器回转数据超时时间,默认为 60s
    nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
    # 后端服务器响应超时时间,默认为 60s
    nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
    # 客户端上传文件,最大大小,默认为 20m
    nginx.ingress.kubernetes.io/proxy-body-size: "10240m"
    # URL 重写
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - host: demo.tavion.com # 游览器通过域名访问,不能使用ip访问,ip访问会报404 找不到资源:http://demo.tavion.com
      http:
        paths:
          - pathType: Prefix
            path: /    # 匹配路径
            backend:
              service:
                name: demo    # deployment的名称
                port:
                  number: 8080    # deployment的端口
shell 复制代码
# 加入转发配置信息到ingress
minikube kubectl -- apply -f demo-ingress.yaml

4.3.3. 例子2:

在外网可以通过www1.westos.org访问myservice服务,也可以通过www2.westos.org访问nginx-svc服务

yml 复制代码
apiVersion: networking.k8s.io/v1betal
kind: Ingress
metadata:
    name: ingress-demo
spec:
    rules:
    - host:www1.westos.org
      http:
        paths:
        - path: /
          backend:
            serviceName: myservice
            servicePort: 80
    - host: www2.westos.org
      http:
        paths:
        - path: /
          backend:
            serviceName: nginx-svc
            servicePort: 80
    

5. 内部端口之间通讯

k8s集群中三种IP(NodeIP、PodIP、ClusterIP)介绍

  • NodeIP:Node 节点的 IP 地址,即物理机(虚拟机)的 IP 地址。
  • PodIP:Pod 的 IP 地址,即 docker 容器的 IP 地址,此为虚拟 IP 地址。
  • ClusterIP:k8s 虚拟的 Service 的 IP 地址,此为虚拟 IP 地址。

5.1. Pod 不会与Pod之间通讯

5.2. service之间通讯

service之间是可以通讯的。

Service种类、类型(ClusterIP、NodePort、LoadBalancer、ExternalName)

配置方法:

配置自定义的外部访问端口,需要在ports里添加nodePort外部访问端口

yml 复制代码
apiVersion: v1
kind: Service 
metadata: 
  name: webapp 
spec: 
  type: NodePort		# 设置 Service 类型为 NodePort
  ports: 
  - port: 8080 			# 设置 Service 暴露的端口为 8080, 即8080(svc) <-> 80(pod)
    targetPort: 8080		# 设置 Pod 的端口为 8080
    nodePort: 30081 	# 设置 NodePort 的端口为 30081,即30081(NodePort) <-> 8080(svc) <-> 80(Pod) 
  selector:
    app: webapp 
shell 复制代码
minikube kubectl -- apply -f webapp-svc.yaml
shell 复制代码
[tavion@tavion-m410 ~]$ kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
webapp       NodePort    10.100.227.225   <none>        8080:31155/TCP   12h
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP          13h
[tavion@tavion-m410 ~]$ ^C
[tavion@tavion-m410 ~]$ curl http://localhost:31155/version
test-v3.1

5.2.1. 例子

服务demo 和 服务demo2

复制代码
语法:
    http://[服务名].[namespace]:[端口]/

服务状态

复制代码
[tavion@tavion-m410 k8s]$ kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
demo         NodePort    10.100.227.225   <none>        8080:31155/TCP   18h
demo2        NodePort    10.105.19.92     <none>        8080:30910/TCP   15m
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP          18h

服务demo2 可以通过 http://demo.default:8080/ 访问demo

6. 挂载卷

K8S的存储系统从基础到高级又大致分为三个层次:普通Volume,Persistent Volume 和动态存储供应。

这里的挂载卷,是普通Volume

yml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo
spec:
  replicas: 3
  selector:
    matchLabels:
      app: demo
  template:
    metadata:
      labels:
        app: demo
    spec:
      containers:
        - name: demo
          image: tavion.com:8380/repos/demo:${version}
          ports:
            - containerPort: 8080
#          volumeMounts: # 映射到docker容器的卷目录或文件
#            - name: nginx-volume-dir  # 映射的卷别名
#              mountPath: /var/log/nginx # 映射到容器的目录
#            - name: nginx-volume-file # 映射的卷别名
#              mountPath: /var/log/nginx/access2.log # 映射到容器的目录
#      volumes:  # 挂载系统的卷
#        - name: nginx-volume-dir  # 挂载的卷的别名
#          hostPath:
#            path: /path/on/host   # 挂载的卷路径
#        - name: nginx-volume-file # 挂载的卷的别名
#          hostPath:
#            path: /path/on/host/access2.log # 挂载的卷文件

7. StatefulSet

参考:https://blog.csdn.net/hguisu/article/details/124228252

StatefulSet 是用来管理有状态的服务。

什么叫有状态和无状态的服务?

  • 无状态是指该服务运行的实例不会在本地存储需要持久化的数据。
    举例:其实就是我们的springboot项目,等不需要保存数据到本地,可以随意扩容。
  • 有状态是指和无状态服务相比,它多了状态保存的需求。即有数据存储功能。
    举例:就像我们的一些消息队列、数据库等,需要数据存储功能。

那么有状态和无状态有什么优点呢?
实例数量:无状态服务可以有一个或多个实例,因此支持两种服务容量调节模式;有状态服务只能有一个实例,不允许创建多个 实例,因此也不支持服务容量调节模式。
存储卷:无状态服务可以有存储卷,也可以没有,即使有也无法备份存储卷里面的数据;有状态服务必须要有存储卷,并且在创建服务时,必须指定给该存储卷分配的磁盘空间大小。
数据存储:无状态服务运行过程中的所有数据(除日志和监控数据)都存在容器实例里的文件系统中,如果实例停止或者删除,则这些数据都将丢失,无法找回;而对于有状态服务,凡是已经挂载了存储卷的目录下的文件内容都可以随时进行备份,备份的数据可以下载,也可以用于恢复新的服务。但对于没有挂载卷的目录下的数据,仍然是无法备份和保存的,如果实例停止或者删除,这些非挂载卷里的文件内容同样会丢失。

那么创建StatefulSet需要怎么做?

在Deployment中,与之对应的服务是service,而在StatefulSet中与之对应的headless service。

所以,同样,我们也需要创建headless service

复制代码
headless service,即无头服务,与service的区别就是它没有Cluster IP,解析它的名称时将返回该Headless Service对应的全部Pod的Endpoint列表。
除此之外,StatefulSet在Headless Service的基础上又为StatefulSet控制的每个Pod副本创建了一个DNS域名,这个域名的格式为:
$(podname).(headless server name)
FQDN:$(podname).(headless server name).namespace.svc.cluster.local

例子1、

第一步创建Headless Service

yml 复制代码
cat sts-web-svc.yaml 
---
apiVersion: v1
kind: Service
metadata:
  name: sts-web-svc
spec:
  selector:
    app: web-nginx
  ports:
  - port: 80
    targetPort: 80
  clusterIP: None     # 设置无IP地址,这是headless service重点

第二步、创建StatefulSet

yml 复制代码
cat sts-web.yaml 
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: sts-web
  namespace: default
spec:
  serviceName: sts-web-svc  # 关联SVC资源
  replicas: 2               # 副本数
  selector:
    matchLabels:            # 关联具有app=web-nginx标签的Pod
      app: web-nginx
  volumeClaimTemplates:        # 卷申请模板 
  - metadata:
      name: www                # 卷申请模板名称
    spec:
      accessModes: ["ReadWriteOnce"] # 访问模式
      storageClassName: nfs          # 指定供应商,前提是需要存在此供应商
      resources:
        requests:
          storage: 1Gi               # 存储大小1G
  template:
    metadata:
      labels:
        app: web-nginx
    spec:
      containers:
      - name: web-nginx
        image: nginx:1.18.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www             # 指定卷申请模板名称
          mountPath: /usr/share/nginx/html
        startupProbe:           # 启动探测
          tcpSocket:
            port: 80

8. 补充语句

访问pod容器,例如:

复制代码
kubectl exec it mynginx -c tomcat -- sh
kubectl exec it mynginx sh

更新镜像

复制代码
kubectl set image deployment my-tomcat tomcat=tomcat:10.1.11 --record

回退镜像

复制代码
kubectl rollout history deploy my-tomcat

9. 部署项目

9.1. 部署springboot项目

复制代码
https://gitee.com/alvis128/demo.git
https://gitee.com/alvis128/demo2.git

9.1.1. 流程

安装插件:verion number

重启jenkins

新建Item

配置拉取仓库

构造环境,添加版本信息

添加Build Steps操作

Build Steps 步骤选项:

Build Steps -1 ,编译,因为我是用gradle编译的,你们可能是maven

Build Steps -2 ,发布到harbor仓库中

Build Steps -3 ,使用k8s 部署springboot项目

保存后,然后运行BuildNow

在控制台查看日志

9. 术语

k8s 里面的一些术语:

  • deployment 部署项目,用来管理pod节点,可以控制pod节点启动、关闭、添加pod等等(部署)
  • pod 是服务的最小单位,每个pod里面都有一个docker。(服务)
  • service 是管理pod服务之间的通讯关系的,(网络方面)
  • ingress 是管理service服务之间的通讯关系(网络方面)

kubernetes里有三张不同的网络,每种IP地址,就代表一个不同的寻址空间:

  • Node IP:Node节点的IP地址
  • Pod IP:Pod的IP地址
  • Cluster IP:内部或集群内访问Service的IP地址
  • External IP是 为了解决如何从外部访问 service 服务的问题。

简写

  • service - svc
  • podes - po
    例如 : kubectl get svc 等同于 kubectl get service
相关推荐
藥瓿亭33 分钟前
K8S认证|CKS题库+答案| 6. 创建 Secret
运维·ubuntu·docker·云原生·容器·kubernetes·cks
2302_8097983238 分钟前
【JavaWeb】Docker项目部署
java·运维·后端·青少年编程·docker·容器
嵌入式大圣40 分钟前
Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
运维·docker·容器
孔令飞1 小时前
Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
ai·云原生·容器·golang·kubernetes
极简网络科技3 小时前
Docker、Wsl 打包迁移环境
运维·docker·容器
杨浦老苏3 小时前
轻量级Docker管理工具Docker Switchboard
运维·docker·群晖
江湖有缘3 小时前
【Docker管理工具】部署Docker可视化管理面板Dpanel
运维·docker·容器
一加一等于二3 小时前
docker部署postgresql17,并且安装插件
docker·postgresql
猫咪老师19955 小时前
多系统一键打包docker compose下所有镜像并且使用
java·docker·容器
aitav05 小时前
⚡️ Linux Docker 基本命令参数详解
linux·运维·docker