首页 文章 精选 留言 我的

精选列表

搜索[k8s],共3934篇文章
优秀的个人博客,低调大师

K8S自己动手系列 - 2.3 - PV & PVC

前言 在实验2.2 – Deployment中,我们将原来基于Pod部署的wordpress+mysql成功改造成基于Deployment部署,基于Deployment部署有很多好处,例如:支持滚动升级(Rolling Update),支持水平扩展。 不过有个问题,就是当我们的Deployment修改了,或者Pod删除重建了,数据也随之丢失了,这是我们不希望看到的,本篇文章我们就来尝试一下基于PV & PVC保存数据状态的有状态应用。 场景 对于单实例的有状态应用,我们可以定义Deployment并且replicas只能为1,用指定PVC的方式关联到一个PV上,使用PV提供的状态存储功能。如果要启动多实例,那么Deployment就无法胜任这个任务,必须使用到我们后面会讲到的StatefulSet+PVC Template的方式创建多实例对多PVC的模型。 本文实验所有的源码保存在:https://github.com/zrbcool/blog-public/tree/master/k8s-hands-on/lab06 实战 PVC定义 lab06 git:(master) cat 03-wordpress-pvc.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: wordpress-pv-claim spec: accessModes: - ReadWriteOnce resources: requests: storage: 2Gi 部署后查看状态 lab06 git:(master) kubectl apply -f 03-wordpress-pvc.yaml persistentvolumeclaim/wordpress-pv-claim created lab06 git:(master) kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE wordpress-mysql-pv-claim Pending 4s 发现PVC处于Pending状态,追查下原因 lab06 git:(master) kubectl describe pvc/wordpress-mysql-pv-claim Name: wordpress-mysql-pv-claim Namespace: default StorageClass: Status: Pending Volume: Labels: <none> Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{},"name":"wordpress-mysql-pv-claim","namespace":"default"},"s... Finalizers: [kubernetes.io/pvc-protection] Capacity: Access Modes: VolumeMode: Filesystem Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal FailedBinding 6s (x4 over 36s) persistentvolume-controller no persistent volumes available for this claim and no storage class is set Mounted By: <none> 接下来我们创建PV PV定义 查看定义 lab06 git:(master) cat 04-wordpress-pv.yaml kind: PersistentVolume apiVersion: v1 metadata: name: wordpress-mysql-pv-volume labels: type: local spec: capacity: storage: 2Gi accessModes: - ReadWriteOnce hostPath: path: "/data/pv/wordpress/mysql" 该pv定义是基于hostPath的方式,所以我们要在节点上提前创建好目录,如下: lab06 git:(master) mkdir -p /data/pv/wordpress/mysql lab06 git:(master) kubectl create -f 04-wordpress-pv.yaml persistentvolume/wordpress-mysql-pv-volume created lab06 git:(master) kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE wordpress-mysql-pv-volume 2Gi RWO Retain Bound default/wordpress-mysql-pv-claim 31s lab06 git:(master) kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE wordpress-mysql-pv-claim Bound wordpress-mysql-pv-volume 2Gi RWO 118s 此时我们之前定义的pvc也已经成功绑定了 使Deployment使用该PVC 查看定义 lab06 git:(master) cat 01-wordpress-mysql-deployment.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: labels: app: wordpress name: wordpress spec: replicas: 1 selector: matchLabels: app: wordpress template: metadata: labels: app: wordpress spec: containers: - image: wordpress:latest imagePullPolicy: IfNotPresent name: wordpress env: - name: WORDPRESS_DB_HOST value: "127.0.0.1" - name: WORDPRESS_DB_USER value: "root" - name: WORDPRESS_DB_PASSWORD value: "passw0rd" - image: mysql:5.7.26 imagePullPolicy: IfNotPresent name: mysql env: - name: MYSQL_ROOT_PASSWORD value: "passw0rd" - name: MYSQL_DATABASE value: "wordpress" volumeMounts: - name: mysql-persistent-storage mountPath: /var/lib/mysql volumes: - name: mysql-persistent-storage persistentVolumeClaim: claimName: wordpress-mysql-pv-claim 执行更新并查看效果 lab06 git:(master) kubectl apply -f 01-wordpress-mysql-deployment.yaml deployment.extensions/wordpress configured lab06 git:(master) kubectl get pod NAME READY STATUS RESTARTS AGE wordpress-6cfd879fcd-9mlhb 2/2 Running 0 29s lab06 git:(master) ls -l /data/pv/wordpress/mysql/ total 188480 -rw-r----- 1 999 999 56 Jun 10 23:42 auto.cnf -rw------- 1 999 999 1675 Jun 10 23:42 ca-key.pem -rw-r--r-- 1 999 999 1107 Jun 10 23:42 ca.pem ... drwxr-x--- 2 999 999 12288 Jun 10 23:42 sys drwxr-x--- 2 999 999 4096 Jun 10 23:42 wordpress 可见,Pod已经在/data/pv/wordpress/mysql/下产生数据了,接下来我们来试一下配置数据后,删除Pod,使Deployment控制Pod重建,配置数据是否能够保存通过下面命令删除Pod使其重建 lab06 git:(master) kubectl get pod NAME READY STATUS RESTARTS AGE wordpress-6cfd879fcd-9mlhb 2/2 Running 0 7m34s lab06 git:(master) kubectl delete pod/wordpress-6cfd879fcd-9mlhb pod "wordpress-6cfd879fcd-9mlhb" deleted lab06 git:(master) kubectl get pod NAME READY STATUS RESTARTS AGE wordpress-6cfd879fcd-29qg9 2/2 Running 1 11s 刷新网页,发布的测试文件还在,测试成功 新问题 查看官网说明:意思是说,对于这个单实例的有状态Deployment不要对其进行扩容,同时当Deployment定义发生更新时也不能使用滚动更新,而应该先删除再创建,也就是strategy: type: Recreate修改后的文件如下: lab06 git:(master) cat 01-wordpress-mysql-deployment.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: labels: app: wordpress name: wordpress spec: strategy: type: Recreate replicas: 1 selector: matchLabels: app: wordpress template: metadata: labels: app: wordpress spec: containers: - image: wordpress:latest imagePullPolicy: IfNotPresent name: wordpress env: - name: WORDPRESS_DB_HOST value: "127.0.0.1" - name: WORDPRESS_DB_USER value: "root" - name: WORDPRESS_DB_PASSWORD value: "passw0rd" - image: mysql:5.7.26 imagePullPolicy: IfNotPresent name: mysql env: - name: MYSQL_ROOT_PASSWORD value: "passw0rd" - name: MYSQL_DATABASE value: "wordpress" volumeMounts: - name: mysql-persistent-storage mountPath: /var/lib/mysql volumes: - name: mysql-persistent-storage persistentVolumeClaim: claimName: wordpress-mysql-pv-claim 清除数据 lab06 git:(master) kubectl delete -f . deployment.extensions "wordpress" deleted service "wordpress-svc" deleted persistentvolumeclaim "wordpress-mysql-pv-claim" deleted persistentvolume "wordpress-mysql-pv-volume" deleted

优秀的个人博客,低调大师

K8S自己动手系列 - 1.3 - Taint & Affinity

Taint please refer https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/三种taint: NoSchedule PreferNoSchedule NoExecute 为节点打Taint ~ kubectl taint node worker02 role=nginx:NoSchedule node/worker02 tainted ~ kubectl describe node worker02 Name: worker02 ... Taints: role=nginx:NoSchedule ~ kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-7cffb9df96-748j6 1/1 Running 0 5m21s 10.244.0.23 worker01 <none> <none> nginx-7cffb9df96-d2rt5 1/1 Running 0 5m22s 10.244.1.35 worker02 <none> <none> 通过查看pod,发现已经运行的pod并未受影响扩容pod,看下效果 ~ kubectl scale --replicas=5 deployment/nginx deployment.extensions/nginx scaled ~ kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-7cffb9df96-4rjhf 0/1 ContainerCreating 0 1s <none> worker01 <none> <none> nginx-7cffb9df96-748j6 1/1 Running 0 6m8s 10.244.0.23 worker01 <none> <none> nginx-7cffb9df96-89ngr 0/1 ContainerCreating 0 1s <none> worker01 <none> <none> nginx-7cffb9df96-d2rt5 1/1 Running 0 6m9s 10.244.1.35 worker02 <none> <none> nginx-7cffb9df96-zsgmd 0/1 ContainerCreating 0 1s <none> worker01 <none> <none> 通过实验发现由于taint NoSchedule的影响,新pod不会调度到含有污点的节点上 移除节点Taint ~ kubectl taint node worker02 role:NoSchedule- node/worker02 untainted 再次扩容,查看效果 ~ kubectl scale --replicas=10 deployment/nginx deployment.extensions/nginx scaled ~ kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-7cffb9df96-2wlln 1/1 Running 0 4s 10.244.1.38 worker02 <none> <none> nginx-7cffb9df96-4rjhf 1/1 Running 0 3m10s 10.244.0.26 worker01 <none> <none> nginx-7cffb9df96-748j6 1/1 Running 0 9m17s 10.244.0.23 worker01 <none> <none> nginx-7cffb9df96-89ngr 1/1 Running 0 3m10s 10.244.0.24 worker01 <none> <none> nginx-7cffb9df96-9vbdt 1/1 Running 0 4s 10.244.1.36 worker02 <none> <none> nginx-7cffb9df96-d2rt5 1/1 Running 0 9m18s 10.244.1.35 worker02 <none> <none> nginx-7cffb9df96-hqvfh 1/1 Running 0 4s 10.244.1.37 worker02 <none> <none> nginx-7cffb9df96-mhxmn 1/1 Running 0 4s 10.244.1.40 worker02 <none> <none> nginx-7cffb9df96-xdnzc 1/1 Running 0 4s 10.244.1.39 worker02 <none> <none> nginx-7cffb9df96-zsgmd 1/1 Running 0 3m10s 10.244.0.25 worker01 <none> <none> 发现新增加的pod已经可以调度到worker02上了 容忍节点Taint 重新为节点增加污点 ~ kubectl taint node worker02 role=nginx:NoSchedule node/worker02 tainted 然后在deploy定义中增加: tolerations: - key: "role" operator: "Equal" value: "nginx" effect: "NoSchedule" 通过kubectl diff -f xxx.yaml可以查看变化情况 lab02 kubectl diff -f nginx-deploy.yaml diff -u -N /tmp/LIVE-021075426/extensions.v1beta1.Deployment.default.nginx /tmp/MERGED-503027673/extensions.v1beta1.Deployment.default.nginx --- /tmp/LIVE-021075426/extensions.v1beta1.Deployment.default.nginx 2019-06-09 15:53:54.120907334 +0800 +++ /tmp/MERGED-503027673/extensions.v1beta1.Deployment.default.nginx 2019-06-09 15:53:54.128907426 +0800 @@ -4,7 +4,7 @@ annotations: deployment.kubernetes.io/revision: "8" creationTimestamp: "2019-06-08T04:27:19Z" - generation: 23 + generation: 24 labels: app: nginx name: nginx @@ -14,7 +14,7 @@ uid: b43106be-89a5-11e9-8ec2-080027a62701 spec: progressDeadlineSeconds: 2147483647 - replicas: 1 + replicas: 2 revisionHistoryLimit: 2147483647 selector: matchLabels: @@ -42,6 +42,11 @@ schedulerName: default-scheduler securityContext: {} terminationGracePeriodSeconds: 30 + tolerations: + - effect: NoSchedule + key: role + operator: Equal + value: nginx status: availableReplicas: 1 conditions: exit status 1 再次扩容,查看效果 lab02 kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-859959cc7f-7sx2p 1/1 Running 0 4s 10.244.0.38 worker01 <none> <none> nginx-859959cc7f-8tpw7 1/1 Running 0 4s 10.244.0.39 worker01 <none> <none> nginx-859959cc7f-ffh7v 1/1 Running 0 4s 10.244.1.49 worker02 <none> <none> nginx-859959cc7f-j2xp7 1/1 Running 0 4s 10.244.0.37 worker01 <none> <none> nginx-859959cc7f-lht8b 1/1 Running 0 4s 10.244.1.47 worker02 <none> <none> nginx-859959cc7f-mcth6 1/1 Running 0 17s 10.244.0.36 worker01 <none> <none> nginx-859959cc7f-sx5ln 1/1 Running 0 4s 10.244.1.48 worker02 <none> <none> nginx-859959cc7f-tlxk5 1/1 Running 0 4s 10.244.1.46 worker02 <none> <none> nginx-859959cc7f-xkjtq 1/1 Running 0 4s 10.244.1.45 worker02 <none> <none> nginx-859959cc7f-xltkz 1/1 Running 0 17s 10.244.1.44 worker02 <none> <none> Affinity 上面通过节点污点的方式,我们可以避免pod被调度到含有污点的节点,同时也可以使某些pod容忍节点的污点,配合下面要说的affinity,可以实现特定节点为特定pod专用的目的 NodeSelector 在pod定义中增加如下: nodeSelector: kubernetes.io/hostname: worker02 执行查看效果 lab02 kubectl apply -f nginx-deploy-toleration-nodeselector.yaml deployment.extensions/nginx configured lab02 kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-564c745dcd-6dtz7 1/1 Running 0 25s 10.244.1.56 worker02 <none> <none> nginx-564c745dcd-fw8kt 1/1 Running 0 25s 10.244.1.55 worker02 <none> <none> nginx-564c745dcd-l8k7m 1/1 Running 0 22s 10.244.1.58 worker02 <none> <none> nginx-564c745dcd-mvqjd 1/1 Running 0 28s 10.244.1.53 worker02 <none> <none> nginx-564c745dcd-qn6r9 1/1 Running 0 29s 10.244.1.52 worker02 <none> <none> nginx-564c745dcd-rbl57 1/1 Running 0 27s 10.244.1.54 worker02 <none> <none> nginx-564c745dcd-s2jbm 1/1 Running 0 19s 10.244.1.59 worker02 <none> <none> nginx-564c745dcd-wnd45 1/1 Running 0 30s 10.244.1.50 worker02 <none> <none> nginx-564c745dcd-zlnfg 1/1 Running 0 30s 10.244.1.51 worker02 <none> <none> nginx-564c745dcd-zm7qx 1/1 Running 0 22s 10.244.1.57 worker02 <none> <none> NodeAffinity NodeAffinity与NodeSelector有相似的作用,但是相比之下有更加灵活的表达语义please refer: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity

优秀的个人博客,低调大师

使用Minikube 搭建最简易的K8S 集群

Minikube Minikuge 是一个跨平台的,可以在本地环境搭起的最简单的一个集群的一个工具。 安装步骤 kubectl kubectl的安装参考官网地址 $ curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl $ chmod +x ./kubectl $ sudo mv ./kubectl /usr/local/bin/kubectl ...... Minikube 参考官方地址 安装 minikube 有两种方式 第一种 $ brew cask install minikube $ sudo mv minikube /usr/local/bin ...... 第二种 $ curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64 \ && chmod +x minikube $ sudo mv minikube /usr/local/bin ...... 启动 $ minikube start ......

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册