API资源对象Deployment;API资源对象Service;API资源对象DaemonSet;API资源对象StatefulSet

API资源对象Deployment;API资源对象Service;API资源对象DaemonSet;API资源对象StatefulSet

API资源对象Deployment

Deployment YAML示例:

vi ng-deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: myngname: ng-deploy
spec:replicas: 2 ##副本数selector:matchLabels:app: myngtemplate:metadata:labels:app: myngspec:containers:- name: myngimage: nginx:1.23.2ports:- name: myng-portcontainerPort: 80

使用YAML创建deploy:

kubectl apply -f ng-deploy.yaml

查看:

kubectl get deploy 
kubectl get po

查看pod分配到哪个节点上

kubectl get po -o wide

API资源对象Service

Service简称(svc) YAML示例:

vi ng-svc.yaml

apiVersion: v1
kind: Service
metadata:name: ngx-svc
spec:selector:app: myngports:- protocol: TCPport: 8080  ##service的porttargetPort: 80  ##pod的port

使用YAML创建service:

kubectl apply -f ng-svc.yaml

查看:

kubectl get svc

三种Service 类型:

1)ClusterIP

该方式为默认类型,即,不定义type字段时(如上面service的示例),就是该类型。

spec:selector:app: myngtype: ClusterIPports:- protocol: TCPport: 8080  ##service的porttargetPort: 80  ##pod的port

2)NodePort

如果想直接通过k8s节点的IP直接访问到service对应的资源,可以使用NodePort,Nodeport对应的端口范围:30000-32767

spec:selector:app: myngtype: NodePortports:- protocol: TCPport: 8080  ##service的porttargetPort: 80  ##pod的portnodePort: 30009  ##可以自定义,也可以不定义,它会自动获取一个端口

3)LoadBlancer

这种方式,需要配合公有云资源比如阿里云、亚马逊云来实现,这里需要一个公网IP作为入口,然后来负载均衡所有的Pod。

spec:selector:app: myngtype: LoadBlancerports:- protocol: TCPport: 8080  ##service的porttargetPort: 80  ##pod的port

API资源对象DaemonSet

有些场景需要在每一个node上运行Pod(比如,网络插件calico、监控、日志收集),Deployment无法做到,而Daemonset(简称ds)可以。Deamonset的目标是,在集群的每一个节点上运行且只运行一个Pod。

Daemonset不支持使用kubectl create获取YAML模板,所以只能照葫芦画瓢了,参考Deployment的YAML编写,其实Daemonset和Deployment的差异很小,除了Kind不一样,还需要去掉replica配置。

vi ds-demo.yaml

apiVersion: apps/v1
kind: DaemonSet
metadata:labels:app: ds-demoname: ds-demo
spec:selector:matchLabels:app: ds-demotemplate:metadata:labels:app: ds-demospec:containers:- name: ds-demoimage: nginx:1.23.2ports:- name: mysql-portcontainerPort: 80

使用YAML创建ds

kubectl apply -f ds-demo.yaml

查看:

kubectl get ds
kubectl get po

但只在两个node节点上启动了pod,没有在master上启动,这是因为默认master有限制。

kubectl describe node k8s01 |grep -i 'taint'
Taints:             node-role.kubernetes.io/control-plane:NoSchedule

说明:Taint叫做污点,如果某一个节点上有污点,则不会被调度运行pod。

但是这个还得取决于Pod自己的一个属性:toleration(容忍),即这个Pod是否能够容忍目标节点是否有污点。

为了解决此问题,我们可以在Pod上增加toleration属性。下面改一下YAML配置:

vi ds-demo.yaml

apiVersion: apps/v1
kind: DaemonSet
metadata:labels:app: ds-demoname: ds-demo
spec:selector:matchLabels:app: ds-demotemplate:metadata:labels:app: ds-demospec:tolerations:- key: node-role.kubernetes.io/control-planeeffect: NoSchedulecontainers:- name: ds-demoimage: nginx:1.23.2ports:- name: mysql-portcontainerPort: 80

再次应用此YAML

kubectl apply -f ds-demo.yaml

API资源对象StatefulSet

Pod根据是否有数据存储分为有状态和无状态:

  • 无状态:指的Pod运行期间不会产生重要数据,即使有数据产生,这些数据丢失了也不影响整个应用。比如Nginx、Tomcat等应用适合无状态。
  • 有状态:指的是Pod运行期间会产生重要的数据,这些数据必须要做持久化,比如MySQL、Redis、RabbitMQ等。

Deployment和Daemonset适合做无状态,而有状态也有一个对应的资源,那就是Statefulset(简称sts)。

说明:由于StatefulSet涉及到了数据持久化,用到了StorageClass,需要先创建一个基于NFS的StorageClass

额外开一台虚拟机,搭建NFS服务(具体步骤略)

假设NFS服务器IP地址为192.168.222.128,共享目录为/data/nfs

另外,要想使用NFS的sc,还需要安装一个NFS provisioner,它的作用是自动创建NFS的pv

github地址: https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner

将源码下载下来:

git clone https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner
cd nfs-subdir-external-provisioner/deploy
sed -i 's/namespace: default/namespace: kube-system/' rbac.yaml  ##修改命名空间为kube-system
kubectl apply -f rbac.yaml  ##创建rbac授权

修改deployment.yaml

sed -i 's/namespace: default/namespace: kube-system/' deployment.yaml ##修改命名空间为kube-system##你需要修改标红的部分 spec:serviceAccountName: nfs-client-provisionercontainers:- name: nfs-client-provisionerimage: chronolaw/nfs-subdir-external-provisioner:v4.0.2  ##改为dockerhub地址volumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: k8s-sigs.io/nfs-subdir-external-provisioner- name: NFS_SERVERvalue: 192.168.222.128  ##nfs服务器地址- name: NFS_PATHvalue: /data/nfs  ##nfs共享目录volumes:- name: nfs-client-rootnfs:server: 192.168.222.128  ##nfs服务器地址path: /data/nfs  ##nfs共享目录

应用yaml

kubectl apply -f deployment.yaml 
kubectl apply -f class.yaml ##创建storageclass

SC YAML示例

cat class.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: nfs-client
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner # or choose another name, must match deployment's env PROVISIONER_NAME'
parameters:archiveOnDelete: "false"  ##自动回收存储空间

Sts示例:

vi redis-sts.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:name: redis-stsspec:serviceName: redis-svc ##这里要有一个serviceName,Sts必须和service关联volumeClaimTemplates:- metadata:name: redis-pvcspec:storageClassName: nfs-clientaccessModes:- ReadWriteManyresources:requests:storage: 500Mireplicas: 2selector:matchLabels:app: redis-ststemplate:metadata:labels:app: redis-stsspec:containers:- image: redis:6.2name: redisports:- containerPort: 6379volumeMounts:- name: redis-pvcmountPath: /data

vi redis-svc.yaml

apiVersion: v1
kind: Service
metadata:name: redis-svcspec:selector:app: redis-stsports:- port: 6379protocol: TCPtargetPort: 6379

应用两个YAML文件

kubectl apply -f redis-sts.yaml -f redis-svc.yaml

对于Sts的Pod,有如下特点:

① Pod名固定有序,后缀从0开始;

② “域名”固定,这个“域名”组成: Pod名.Svc名,例如 redis-sts-0.redis-svc;

③ 每个Pod对应的PVC也是固定的;

实验:

ping 域名

kubectl exec -it redis-sts-0 -- bash   ##进去可以ping redis-sts-0.redis-svc 和  redis-sts-1.redis-svc

创建key

kubectl exec -it redis-sts-0 -- redis-cli
127.0.0.1:6379> set k1 'abc'
OK
127.0.0.1:6379> set k2 'bcd'
OK

模拟故障

kubectl delete pod redis-sts-0

删除后,它会自动重新创建同名Pod,再次进入查看redis key

kubectl exec -it redis-sts-0 -- redis-cli
127.0.0.1:6379> get k1
"abc"
127.0.0.1:6379> get k2
"bcd"

数据依然存在。

关于Sts里的多个Pod之间的数据同步

K8s并不负责Sts里的Pod间数据同步, 具体的数据同步和一致性策略取决于我们部署的有状态应用程序。不同的应用程序可能使用不同的数据同步和一致性策略。例如,关系型数据库(如 MySQL)可能使用主-从复制,而分布式数据库(如 MongoDB)可能使用一种基于分区和副本的数据同步机制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/197192.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Cloud + Vue前后端分离-在线课程介绍

第2章 使用Maven搭建SpringCloud项目 第3章 SpringBoot项目技术整合 第4章 使用Vue cli 4搭建管理控台 第5章 单表管理功能前后端开发 第6章 通用代码生成器开发 第7章 核心业务功能开发 第8章 文件上传功能开发 第9章 大文件断点续与极速秒传 第10章 基于阿里云OSS的文…

前端面试题(面试碰到的一些)(一)

1、浏览器的存储方式都有哪些? cookie: 优点——兼容性好,请求头自带cookie方便 。缺点——大小只有4k, 请求头加入 cookie 浪费流量(多用于记录登录状态) localStorage: 优点—— 操作方便,永久性存储&#xff…

JIRA 重建索引加快速度

JIRA 重建索引加快速度 JIRA数据量大时,做一遍reindex的速度会很慢,经常需要几个小时 这是后需要查看CPU,如果做reindex时候CPU占用率不高,增加 index的线程数以加快 reindex 配置步骤 停止掉JIRA在home目录下的 jira-config.…

漫谈HBuilderX App-Jenkins热更新构建

漫谈Uniapp App热更新包-Jenkins CI/CD打包工具链的搭建 零、写在前面 HBuilderX是DCloud旗下的IDE产品,目前只提供了Windows和Mac版本使用。本项目组在开发阶段经常需要向测试环境提交热更新包,使用Jenkins进行CD是非常有必要的一步。尽管HBuilderX提…

python pyaudio给数据加噪声

python pyaudio给数据加噪声 # -*- coding: utf-8 -*- import argparse import array import math import numpy import numpy as np import random import wavedef get_args():parser argparse.ArgumentParser()parser.add_argument("--clean_file", typestr, req…

cordova详解

从八个方面让你快速了解cordova(一) - 掘金 从八个方面让你快速了解cordova(二) - 掘金 Cordova和React-Native两种框架的区别和优劣分析_cordova和react native-CSDN博客 Cordova开发App的优缺点是什么? - 咕噜企业…

开源CDN软件GoEdge —— 筑梦之路

官方网站:GoEdge CDN - 制作自己的CDN - GoEdge CDN | 自建CDN GoEdge是一款管理分布式CDN边缘节点的开源工具软件,目的是让用户轻松地、低成本地创建CDN/WAF等应用。 特性 免费 - 开源、免费、自由、开放 简单 - 架构简单清晰,安装简单&a…

Android,JNI开发和NDK之间的联系

Android,JNI开发和NDK。 1.jni和ndk jni是在jdk中就有出现的 在我们jdk路径中 D:\java\jdk11\include 这就是jdk中的jni Android开发环境中的ndk也有jni, D:\Android\sdk\ndk\20.0.5594570\toolchains\llvm\prebuilt\windows-x86_64\sysroot\usr\in…

DICE模型原理

随着温室气体排放量的增大和温室效应的增强,全球气候变化问题受到日益的关注。我国政府庄严承诺在2030和2060年分别达到“碳达峰”和“碳中和”,因此气候变化和碳排放已经成为科研人员重点关心的问题之一。气候变化问题不仅仅是科学的问题,同…

Django二转Day06

1.多表查询 基于对象 基于双下划线 正向和反向 聚合查询 分组查询(配合聚合使用) F查询和Q查询 2.其他字段和字段参数 其他字段 字段参数;ORM参数 ForeignKey 属性 ManyToManyField 用于表示多对多的关联关系。在数据库中通过第三…

解决msvcp140.dll丢失问题的5种方法,验证有效

在计算机编程和软件开发中,我们经常会遇到一些陌生的DLL文件,比如msvcp140.dll。这些DLL文件是动态链接库(Dynamic Link Libraries)的缩写,它们包含了可以被多个程序共享的代码和数据。那么,msvcp140.dll是…

优思学院|六西格玛中的过程管理思维

过程是什么? 过程(Process)是一系列相互关联的活动,将输入转化为输出,我们习惯于用 X 来表示输入,用 Y 来表示输出,就如下图一样。在产品(服务)质量形成过程中&#xff…

【ArcGIS Pro微课1000例】0048:深度学习--人群计数

文章目录 一、小学回忆录二、深度学习计算人头数三、案例实现一、小学回忆录 加载配套实验数据包中的图片及训练模型。你还记得当年的小学毕业班有多少同学吗?今天我们就用ArcGIS提供的人工智能工具,重温一下童年记忆。 二、深度学习计算人头数 本案例使用到的是深度学习中…

pyinstaller打包pyside

准备软件 准备一个python代码展示pyside的gui 安装PyInstaller 首先检查本机有没有安装PyInstaller ,如果没有安装的话,需要运行 pip3 install PyInstaller 打包windowed界面 pyinstaller -w pymain.py 问题 Could not find the Qt platform plugi…

UNDERSTANDING AND IMPROVING INFORMATION TRANSFER IN MULTI-TASK LEARNING

Z i _i i​ X i R i X_iR_i Xi​Ri​, X X X是Task embedding layers, R R R是Alignment matrices 辅助信息 作者未提供代码

编程实战:类C语法的编译型脚本解释器(七)语句

系列入口: 编程实战:类C语法的编译型脚本解释器(系列)-CSDN博客 本文介绍语句,主要是控制语句,if、else、for之类。 一、语句概览 //语句//EXPRESSION RETURN:expressions[0]//BLOCK:senetnces//IF:if(exp…

github setting在哪

像创建一个ssh连接, 参考:【Github问题解决】解决Github:fatal:unable to access ‘https://github.com/.../.git‘:Could not resolve host:git_阳的糖的博客-CSDN博客

安全测试之推荐工具(一)

文章目录 一、前言二、Web安全(一)AppScan(推荐)(二)AWVS(推荐)(三)Burp Suite(推荐)(四)OWASP ZAP 三、主机安…

《python每天一小段》--(9)使用Paramiko库,批量操作linux服务器

使用Paramiko库,批量操作多Linux服务器 使用Paramiko库建立SSH连接并执行命令获取多个Linux服务器的磁盘信息。通过这个例子,你可以学习到如何使用Python自动化操作远程服务器。 操作如图: 查看了两台服务器的磁盘容量: 安装模…

Socket 编程

1:针对 TCP 应该如何 Socket 编程? 服务端和客户端初始化 socket,得到文件描述符; 服务端调用 bind,将 socket 绑定在指定的 IP 地址和端口; 服务端调用 listen,进行监听; 服务端调用 accept&am…