创建第一个pod

kubectl create deployment nginx-deploy --image=nginx

kubectl get pod -o wide  # 查看 pod
kubectl expose deployment nginx-deploy --port=80 --type=NodePort # 暴露 deployment
kubectl get service nginx-deploy # 查看 service
kubectl delete deployment nginx-deploy # 删除 deployment
kubectl delete service nginx-deploy # 删除 service kubectl get pod nginx-deploy-8cc8b9c49-xshrr -o yaml
kubectl get pod nginx-deploy-8cc8b9c49-xshrr -o wide
kubectl describe pods nginx-deploy-8cc8b9c49-xshrr
kubectl exec -it nginx-deploy-8cc8b9c49-xshrr -- sh
kubectl logs nginx-deploy-8cc8b9c49-xshrr

创建Deployment

vi deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy # Deployment名称
spec:
replicas: 2 # 期望的Pod副本数
selector:
matchLabels:
app: nginx # 选择所有包含app=nginx标签的Pod
minReadySeconds: 2 # Pod准备就绪前需要等待的最小秒数
strategy:
type: RollingUpdate # 更新策略为滚动更新
rollingUpdate:
maxUnavailable: 1 # 滚动更新期间最多允许1个Pod不可用
maxSurge: 1 # 滚动更新期间最多允许额外创建1个Pod
template:
metadata:
labels:
app: nginx # Pod的标签
spec:
containers:
- name: nginx-pod # 容器名称
image: nginx:1.13.0 # 使用的镜像
imagePullPolicy: IfNotPresent # 优先使用本地镜像,不存在时才拉取
ports:
- containerPort: 80 # 容器内部监听的端口,官方的nginx镜像默认配置为监听 80 端口,而非 8080。即使这里配置的是8080,访问的时候仍然需要使用80端口。
resources: # 后续HPA会用到资源限制
limits:
cpu: "100m" # CPU限制为100毫核
requests:
cpu: "50m" # CPU请求为50毫核
kubectl apply -f deployment.yaml

kubectl get deployment nginx-deploy -owide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
nginx-deploy 2/2 2 2 178m nginx-pod nginx:1.13.0 app=nginx kubectl get rs -owide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
nginx-deploy-68ff6f9d47 2 2 2 151m nginx-pod nginx:1.13.0 app=nginx,pod-template-hash=68ff6f9d47

滚动升级和回滚

vi deployment.yaml
image: nginx:1.13.0 >> image: nginx:latest # 修改镜像版本 kubectl apply -f deployment.yaml --record=true # 记录此次更新,以便日后回滚
kubectl rollout status deployment nginx-deploy # 查看滚动升级状态 # 回滚到上一个版本(无需指定版本号)
kubectl rollout undo deployment nginx-deploy
# 或回滚到指定版本(需确认版本号存在)
kubectl rollout undo deployment nginx-deploy --to-revision=1
kubectl rollout status deployment nginx-deploy # 查看回滚状态

创建serivce

vi service.yaml

apiVersion: v1
kind: Service
metadata:
name: nginx-svc # Service的名称,在同一个命名空间内必须唯一
labels:
app: nginx
spec:
type: NodePort
ports:
- port: 80 # Service 在集群内部的端口(其他 Pod 通过此端口访问该服务)
nodePort: 30080 # 节点上暴露的端口,外部可通过 <NodeIP>:30080 访问服务,范围是30000-32767。
protocol: TCP
selector:
app: nginx # selector下的app标签要和Pod的label一致
kubectl apply -f service.yaml

以下两个地方要注意,要保持一致
service.yaml --> spec.selector
deployment.yaml --> spec.template.metadata.labels
kubectl describe svc nginx-svc
Name: nginx-svc
Namespace: default
Labels: app=nginx
Annotations: <none>
Selector: app=nginx
Type: NodePort
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.100.160.27
IPs: 10.100.160.27
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 30080/TCP
Endpoints: 10.240.214.207:80,10.240.214.208:80
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>

Endpoint 是Service和Pod之间的桥梁,它记录了哪些Pod可以被访问。

访问Service

Service 的网络标识:ClusterIP、DNS 名称

kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 43h
nginx-svc NodePort 10.100.160.27 <none> 80:30080/TCP 18h

NAME: nginx-svc

CLUSTER-IP: 10.100.160.27

PORT:80

NodePort: 30080

从集群内部,可以通过前3个值(Name、ClusterIP、port)来直接访问

从集群外部,可以通过NodeIP:NodePort来访问

curl 10.100.160.27:80 # 集群内部访问Service

curl nginx-svc:80 # Pod内部通过DNS访问Service

curl 1.1.1.100:30080 # 集群外部访问Service es100:30800

HPA

前提条件:部署nginx,可参考上面的Deployment和Service部分

vi metric-server.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
labels:
k8s-app: metrics-server
name: metrics-server
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
labels:
k8s-app: metrics-server
rbac.authorization.k8s.io/aggregate-to-admin: "true"
rbac.authorization.k8s.io/aggregate-to-edit: "true"
rbac.authorization.k8s.io/aggregate-to-view: "true"
name: system:aggregated-metrics-reader
rules:
- apiGroups:
- metrics.k8s.io
resources:
- pods
- nodes
verbs:
- get
- list
- watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
labels:
k8s-app: metrics-server
name: system:metrics-server
rules:
- apiGroups:
- ""
resources:
- nodes/metrics
verbs:
- get
- apiGroups:
- ""
resources:
- pods
- nodes
verbs:
- get
- list
- watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
labels:
k8s-app: metrics-server
name: metrics-server-auth-reader
namespace: kube-system
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: extension-apiserver-authentication-reader
subjects:
- kind: ServiceAccount
name: metrics-server
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
labels:
k8s-app: metrics-server
name: metrics-server:system:auth-delegator
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:auth-delegator
subjects:
- kind: ServiceAccount
name: metrics-server
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
labels:
k8s-app: metrics-server
name: system:metrics-server
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:metrics-server
subjects:
- kind: ServiceAccount
name: metrics-server
namespace: kube-system
---
apiVersion: v1
kind: Service
metadata:
labels:
k8s-app: metrics-server
name: metrics-server
namespace: kube-system
spec:
ports:
- name: https
port: 443
protocol: TCP
targetPort: https
selector:
k8s-app: metrics-server
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
k8s-app: metrics-server
name: metrics-server
namespace: kube-system
spec:
selector:
matchLabels:
k8s-app: metrics-server
strategy:
rollingUpdate:
maxUnavailable: 0
template:
metadata:
labels:
k8s-app: metrics-server
spec:
containers:
- args:
- --cert-dir=/tmp
- --secure-port=4443
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --metric-resolution=15s
- --kubelet-insecure-tls
image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/metrics-server/metrics-server:v0.6.4
imagePullPolicy: IfNotPresent
livenessProbe:
failureThreshold: 3
httpGet:
path: /livez
port: https
scheme: HTTPS
periodSeconds: 10
name: metrics-server
ports:
- containerPort: 4443
name: https
protocol: TCP
readinessProbe:
failureThreshold: 3
httpGet:
path: /readyz
port: https
scheme: HTTPS
initialDelaySeconds: 20
periodSeconds: 10
resources:
requests:
cpu: 100m
memory: 200Mi
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
runAsNonRoot: true
runAsUser: 1000
volumeMounts:
- mountPath: /tmp
name: tmp-dir
nodeSelector:
kubernetes.io/os: linux
priorityClassName: system-cluster-critical
serviceAccountName: metrics-server
volumes:
- emptyDir: {}
name: tmp-dir
---
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
labels:
k8s-app: metrics-server
name: v1beta1.metrics.k8s.io
spec:
group: metrics.k8s.io
groupPriorityMinimum: 100
insecureSkipTLSVerify: true
service:
name: metrics-server
namespace: kube-system
version: v1beta1
versionPriority: 100
kubectl apply -f metric-server.yaml

kubectl autoscale deployment nginx-deploy --cpu-percent=50 --min=2 --max=10  # 创建HPA,自动扩容,CPU使用率超过50%,最小2个Pod,最大10个Pod

horizontalpodautoscaler.autoscaling/nginx-deploy autoscaled  # 查看HPA状态

测试开始:使用一下Python代码进行连接模拟

原本是来模拟http版本请求的,凑合着用吧

import time
import httpx
import ssl while True:
with httpx.Client(http2=False, verify=False) as client: # http2=True则使用 HTTP2,http2=False,则默认采用 HTTP/1.1 协议
response = client.get('http://1.1.1.100:30080', headers={'Host': url})
response = client.get('http://1.1.1.80:30080', headers={'Host': url})
time.sleep(1) # 这里可以自由调节,间隔越小,CPU使用率越高

观测结果:

kubectl get hpa nginx-deploy --watch  # 观察HPA自动扩容

kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deploy-74db4c6d6f-65lzx 1/1 Running 0 16h
nginx-deploy-74db4c6d6f-kzwvn 1/1 Running 0 5m11s
nginx-deploy-74db4c6d6f-xf99c 1/1 Running 0 16h
nginx-deploy-74db4c6d6f-xv9hc 1/1 Running 0 5m11s kubectl get hpa nginx-deploy --watch
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
nginx-deploy Deployment/nginx-deploy 0%/50% 2 10 2 19h
nginx-deploy Deployment/nginx-deploy 38%/50% 2 10 2 19h
nginx-deploy Deployment/nginx-deploy 92%/50% 2 10 2 19h
nginx-deploy Deployment/nginx-deploy 106%/50% 2 10 4 19h
nginx-deploy Deployment/nginx-deploy 72%/50% 2 10 4 19h
nginx-deploy Deployment/nginx-deploy 0%/50% 2 10 4 19h nginx-deploy Deployment/nginx-deploy 0%/50% 2 10 4 19h
nginx-deploy Deployment/nginx-deploy 0%/50% 2 10 2 19h

K8S三、实战的更多相关文章

  1. k8s经典实战—搭建WordPress

    k8s经典实战—搭建WordPress说明:需要在k8s上部署lnmp环境,建议跟着步骤来端口最好不要改,希望你也能搭建成功,完成这个搭建后你对Kubernetes的技术基本上是入门了.首先看下效果图 ...

  2. 国内不fq安装K8S三: 使用helm安装kubernet-dashboard

    目录 3 使用helm安装kubernet-dashboard 3.1 Helm的安装 3.2 使用Helm部署Nginx Ingress 3.3 使用Helm部署dashboard 3.4 使用He ...

  3. 微信小程序入门三实战

    微信小应用借鉴了很多web的理念,但是其与传统的webApp.微信公共号这些BS架构不同,他是CS架构,是客户端的程序 小程序开发实战--豆瓣电影 项目配置 -在app.jsop中进行简单配置 --n ...

  4. Ubuntu 安装 k8s 三驾马车 kubelet kubeadm kubectl

    Ubuntu 版本是 18.04 ,用的是阿里云服务器,记录一下自己实际安装过程的操作步骤. 安装 docker 安装所需的软件 apt-get update apt-get install -y a ...

  5. 3、k8s 核心实战

    7 kubernets核心实战 7.1 资源创建方式 命令行 yaml 7.2 namespace 名称空间来隔离资源 命令行方式 kubectl create ns hello kubectl de ...

  6. 【转】手摸手,带你用vue撸后台 系列三(实战篇)

    前言 在前面两篇文章中已经把基础工作环境构建完成,也已经把后台核心的登录和权限完成了,现在手摸手,一起进入实操. Element 去年十月份开始用vue做管理后台的时候毫不犹豫的就选择了Elemen, ...

  7. rpm,docker,k8s三种方式安装部署GitLab服务

    rpm方式 源地址:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/ wget https://mirrors.tuna.tsinghua ...

  8. 单点登录(三)-----实战-----cas server 源码下载和部署

    我们在上一篇文章中使用的是4.0版本的cas,4.0版本的有发布好的war包可以直接使用,那如果我们要使用更新的版本怎么办呢? 就需要下载源码自己编辑打包了. 步骤如下: 版本选择 我们在cas的gi ...

  9. .net core i上 K8S(三)Yaml文件运行.netcore程序

    上一章我们通过kubectl run简单运行了一个.netcore网站,但实际的开发中,我们都是通过yaml来实现的. 1.编写yaml文件 关于yaml文件的格式在此就不多描述了,不熟悉的可以去网上 ...

  10. K8S(16)集成实战-使用spinnaker进行自动化部署

    K8s集成实战-使用spinnaker进行自动化部署 1 spinnaker概述和选型 1.1 概述 1.1.1 主要功能 Spinnaker是一个开源的多云持续交付平台,提供快速.可靠.稳定的软件变 ...

随机推荐

  1. AI提示词:通用 vscode linux c++ 项目CMakeLists和bulid模板

    AI提示词 写vscode linux c++20 的CMakeLists.txt文件.build.rebuild文件 这是多项目结构,目录结构如下: projs: │ build.sh 顶层buil ...

  2. 2.7K star!这个汉字工具库让中文处理变得超简单,开发者必备!

    嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 cnchar 是一个功能全面的汉字工具库,提供拼音转换.笔画动画.偏旁查询.成语接龙.语音合 ...

  3. Java8 新特性-Lambda表达式

    目录 1.Lambda表达式介绍 2.Lambda表达式语法细讲 3. Lambda表达式语法精简 4. Lambda方法引用 5. 综合实例 6. @FunctionalInterface注解 7. ...

  4. 【代码】百度语音API|Python|文本朗读

    百度语音合成官方教程_AI开放平台 百度语音合成官方demo_github.com 简单地写了一个按段落朗读文本的demo:DEMO链接_gitee.com. 有时候会请求不到数据,不知道是网络原因还 ...

  5. Axure RP大数据可视化大屏原型组件源文件

    Axure RP大数据可视化大屏原型模板 大数据BI分析上大屏,在很多大企业和政府单位客户都需要,高新区市场监控等,那使用Axure RP做交互原型是必不可少的,有了大屏原型模板可做出不同风格和行业的 ...

  6. Stream.findFirst()代替get(0)和数组[0]获取集合中的第一个值

    一.介绍 语法 集合.stream().findFirst() 使用 // 我们的工具类(切割SKU字符串relatedSkuJoin,转为集合).stream.第一个数(): CommonUtils ...

  7. 进程间通信-POSIX 消息队列

    POSIX 消息队列 POSIX 消息队列可以认为是一个消息链表.进程(线程)可以往里写消息,也可以从里面取出消息.可以在不相关的进程之间发送和接收数据. 创建(打开)消息队列-mq_open()函数 ...

  8. JavaScript入门笔记day2

    文章目录 常用互动方法 1. document.write() 直接向页面输出内容 2. `alert();`弹出消息对话框 3. confirm消息对话框 4. prompt弹出消息对话框,用于需要 ...

  9. odoo14忘记后台密码解决办法

    直接在数据库里面修改: # 更新密码(假设用为 id 为 1,可通过 SELECT 进行查询) UPDATE res_users SET password_crypt='your new passwo ...

  10. Java stream sorted自定义排序规则实现多字段排序

      Stream 提供了丰富的操作(中间操作和终端操作)集合元素的轮子,但Stream流操作不影响原始集合数据,执行结果是一个新的集合对象.在<Java stream sorted使用 Comp ...