
愿景:"让编程不再难学,让技术与生活更加有趣" xdclass.net
简介:架构师系列-容器编排调度K8S最佳实践专题课程介绍-课程适合人员和学后水平
课程介绍
本套课程 是全新录制,从0到1讲解新版kubernetes核心基础+高级知识点+可视化管理工具Rancher实战
核心介绍
为什么要学习容器编排调度Kubernetes
多数互联网公司里面用的技术,实现跨主机多容器编排调度管理的最佳技术之一
可以实现服务注册发现、DevOps自动部署和回滚,能够自动实现请求的负载均衡分配网络流量
在多数互联网公司中,Kubernetes占有率很高,是近几年大量流行
可以作为公司内部培训技术分享必备知识,超多案例+实战等
有谁在用,进一线大厂(国内大厂多数都有用 )
如果你想成为下面的一种,则这个课程是必备
课程技术栈和测试环境说明
阿里云Linux CentOS 7服务器
技术不断更新,版本如何选择(跟着课程走,主流版本)
学后水平
学习形式
【必做事情】更多技术问题+职业规划,可以加我微信

简介:架构师系列-容器编排调度K8S最佳实践课程大纲速览
课程学前基础
目录大纲浏览
学习要求:
课程有配套资料,如果有用到就会在对应章集的资料里面,如果自己操作的情况和视频不一样,仔细对比对比验证基本就可以发现问题了
K8S配置多,所以遇到和课程效果不一样的,建议看多几次,结合笔记里面的配置
重点先把概念+解决方案掌握
不同岗位对K8S的侧重点
保持谦虚好学、术业有专攻、在校的学生,有些知识掌握也比工作好几年掌握的人厉害
文档
愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介:老王的经历-互联网项目部署方式历史发展
相信大家对K8S是又爱又恨

应用程序部署方式

传统部署时代:
早期的时候,在物理服务器上运行应用程序
缺点
虚拟化部署时代:
虚拟化技术允许在单个物理服务器的 CPU 上运行多台虚拟机(VM)。
虚拟化能使应用程序在不同 VM 之间被彼此隔离,且能提供一定程度的安全性
能够更好地利用物理服务器的资源,具有更高的可伸缩性,以及降低硬件成本等等的好处
缺点
容器部署时代:
容器类似于 VM,但是更宽松的隔离特性,使容器之间可以共享操作系统(OS)
最熟悉的就是Docker容器化技术
容器比起 VM 被认为是更轻量级的,每个容器都具有自己的文件系统、CPU、内存、进程空间等。
跨云和操作系统发行版本的可移植性:可在 Ubuntu、CoreOS、CentOS、 Google Kubernetes Engine 和其他任何地方运行

简介:容器化带来的问题和K8S快速认知
容器化部署存在的问题
问题
上面容器管理的问题称为容器编排,为了解决这些问题,产生了一些容器编排的软件

什么是Kubernetes?
不说那么多废话了
k8s常见的功能:
服务发现和负载均衡
存储编排
自动部署和回滚
自我修复
密钥与配置管理
K8S允许存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥
简介:Kubernetes常见组件和整体架构讲解《上》
K8S整体架构,也是Client-Server模型

kubernetes常见概念
Master
Node
Pod
Pod是一组容器, 在K8S中,最小的单位是Pod, 一个Pod可以包含多个容器,但通常情况下我们在每个Pod中仅使用一个容器
可以把Pod理解成豌豆荚, Pod内的每个容器是一颗颗豌豆
分类

Pod Controller
控制器是管理pod的中间层,只需要告诉Pod控制器,想要创建多少个什么样的Pod,它会创建出满足条件的Pod并确保每一个Pod资源处于用户期望的目标状态。如果Pod在运行中出现故障,它会基于指定策略重新编排Pod
通过它来实现对pod的管理,比如启动pod、停止pod、扩展pod的数量等等
类型
Service
Label
K8S提供了一种机制来为Pod进行分类,那就是Label(标签),同一类pod会拥有相同的标签
Label的具体形式是key-value的标记对,可以在创建资源的时候设置,也可以在后期添加和修改
给某个资源对象定义一个Label,就相当于给它打了一个标签,可以通过Label Selector(标签选择器)查询和筛选拥有某些Label的资源对象,K8S通过这种方式实现了类似SQL的对象查询机制
应用场景


Label选择器
对应的资源打上标签后,可以使用标签选择器过滤指定的标签
标签选择器目前有两个
NameSpace:
可以在一个物理集群上运行多个虚拟集群,这种虚拟集群被称作 命名空间,用来隔离pod的运行环境
同一个名字空间中的资源名称必须唯一,而不同名字空间之间则没有这个要求
NameSpace是不能嵌套的,每一个 Kubernetes 的资源都只能在一个NameSpace内
名字空间是在多个用户之间划分集群资源的一种方法(通过资源配额)
不必使用多个名字空间来分隔轻微不同的资源,例如同一软件的不同版本: 应该使用标签 来区分同一名字空间中的不同资源
Kubernetes 会创建四个初始NameSpace名称空间:
应用分类
有状态应用
无状态应用
简介:Kubernetes常见组件和整体架构讲解《下》
K8S整体架构,也是Client-Server模型
控制节点Master-Node,负责集群的管理
工作节点Worker-Node,负责为集群提供运行环境

愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介:K8S常见集群架构和搭建方式介绍
k8s集群类型有多种
单master-Node集群
多master-Node集群
单节点k8s集群

k8s搭建方式:
kubeadm搭建(推荐)
二进制包搭建
Minikube搭建:
课程选择方案
方案一:Minikube搭建进行搭建,1台服务器
方案二:一主多从,共2台以上服务器
多种方案都可以,所以搭建不用纠结学习使用哪种,命令操作都一样的
每台机器配置需要 2核4G内存以上
云服务器说明【!!!!特别重要!!!!】
简介:急速上手Minikube搭建单节点 k8s集群实战
Minikube搭建:
安装
x# 1.先安装ymlyum install -y yum-utils device-mapper-persistent-data lvm2# 2.设置阿里云镜像sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo# 3.查看可安装的docker版本yum list docker-ce --showduplicates | sort -r#4. 安装dockeryum -y install docker-ce-20.10.10-3.el7#5. 查看docker版本docker -v#配置开机自启动systemctl enable docker.service#6. 启动dockersystemctl start docker#7. 查看docker 启动状态systemctl status docker
xxxxxxxxxxcat > /etc/yum.repos.d/kubernetes.repo << EOF[kubernetes]name=Kubernetesbaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64enabled=1gpgcheck=0repo_gpgcheck=0gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgEOF
xxxxxxxxxxyum install -y kubectl-1.18.0
xxxxxxxxxxcurl -LO https://storage.googleapis.com/minikube/releases/v1.18.1/minikube-linux-amd64 && sudo install minikube-linux-amd64 /usr/local/bin/minikube
xxxxxxxxxxminikube version
xxxxxxxxxxminikube start --image-mirror-country='cn' --driver=docker --force --kubernetes-version=1.18.1 --registry-mirror=https://registry.docker-cn.com#查看kubectl cluster-info
简介:5分钟带你搭建 k8s部署第一个应用
xxxxxxxxxxkubectl cluster-info

xxxxxxxxxxkubectl get node

xxxxxxxxxxkubectl get pod -A

部署第一个K8S应用-Nginx,并通过公网ip访问
xxxxxxxxxxkubectl create deployment xdclass-nginx --image=nginx:1.23.0对比Docker部署docker run --name xdclass-nginx -p 8080:80 -d nginx:1.23.0
xxxxxxxxxxkubectl get deployment,pod,svc

xxxxxxxxxxkubectl expose deployment xdclass-nginx --port=80 --type=NodePort
xxxxxxxxxxkubectl port-forward --address 0.0.0.0 service/xdclass-nginx 80:80解释:kubectl port-forward 转发一个本地端口到 Pod 端口,不会返回数据,需要打开另一个终端来继续这个练习

注意
Minikube的搭建跟用Kubeadm的有一点不一样
简介:基于KubeAdm搭建多节点K8S集群
安装步骤
安装docker(主节点+工作节点)
xxxxxxxxxx# 1.先安装ymlyum install -y yum-utils device-mapper-persistent-data lvm2# 2.设置阿里云镜像sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo# 3.查看可安装的docker版本yum list docker-ce --showduplicates | sort -r#4. 安装dockeryum -y install docker-ce-20.10.10-3.el7#5. 查看docker版本docker -v#配置开机自启动systemctl enable docker.service#6. 启动dockersystemctl start docker#7. 查看docker 启动状态systemctl status docker
配置阿里云镜像源(主节点+工作节点)
xxxxxxxxxxcat > /etc/yum.repos.d/kubernetes.repo << EOF[kubernetes]name=Kubernetesbaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64enabled=1gpgcheck=0repo_gpgcheck=0gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgEOF
安装kubelet kubeadm kubectl(主节点+工作节点)
xxxxxxxxxxyum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
主节点初始化(主节点)
xxxxxxxxxxkubeadm init \--apiserver-advertise-address=172.31.101.9 \--image-repository registry.aliyuncs.com/google_containers \--kubernetes-version v1.18.0 \--service-cidr=10.96.0.0/12 \--pod-network-cidr=10.244.0.0/16只修改两个地方(master主机【内网IP】,k8s软件版本)
说明:
当初始化完成之后执行命令,并加入工作节点


加入工作节点

查看节点
xxxxxxxxxxkubectl get nodes#状态都是NotReady,需要配置网络插件
安装网络插件
xxxxxxxxxxkubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
xxxxxxxxxxkubectl apply -f flannel.yaml#flannel.yaml 文件内容---apiVersion: policy/v1beta1kind: PodSecurityPolicymetadata:name: psp.flannel.unprivilegedannotations:seccomp.security.alpha.kubernetes.io/allowedProfileNames: docker/defaultseccomp.security.alpha.kubernetes.io/defaultProfileName: docker/defaultapparmor.security.beta.kubernetes.io/allowedProfileNames: runtime/defaultapparmor.security.beta.kubernetes.io/defaultProfileName: runtime/defaultspec:privileged: falsevolumes:- configMap- secret- emptyDir- hostPathallowedHostPaths:- pathPrefix: "/etc/cni/net.d"- pathPrefix: "/etc/kube-flannel"- pathPrefix: "/run/flannel"readOnlyRootFilesystem: false# Users and groupsrunAsUser:rule: RunAsAnysupplementalGroups:rule: RunAsAnyfsGroup:rule: RunAsAny# Privilege EscalationallowPrivilegeEscalation: falsedefaultAllowPrivilegeEscalation: false# CapabilitiesallowedCapabilities: ['NET_ADMIN']defaultAddCapabilities: []requiredDropCapabilities: []# Host namespaceshostPID: falsehostIPC: falsehostNetwork: truehostPorts:- min: 0max: 65535# SELinuxseLinux:# SELinux is unsed in CaaSPrule: 'RunAsAny'---kind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1beta1metadata:name: flannelrules:- apiGroups: ['extensions']resources: ['podsecuritypolicies']verbs: ['use']resourceNames: ['psp.flannel.unprivileged']- apiGroups:- ""resources:- podsverbs:- get- apiGroups:- ""resources:- nodesverbs:- list- watch- apiGroups:- ""resources:- nodes/statusverbs:- patch---kind: ClusterRoleBindingapiVersion: rbac.authorization.k8s.io/v1beta1metadata:name: flannelroleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: flannelsubjects:- kind: ServiceAccountname: flannelnamespace: kube-system---apiVersion: v1kind: ServiceAccountmetadata:name: flannelnamespace: kube-system---kind: ConfigMapapiVersion: v1metadata:name: kube-flannel-cfgnamespace: kube-systemlabels:tier: nodeapp: flanneldata:cni-conf.json: |{"cniVersion": "0.2.0","name": "cbr0","plugins": [{"type": "flannel","delegate": {"hairpinMode": true,"isDefaultGateway": true}},{"type": "portmap","capabilities": {"portMappings": true}}]}net-conf.json: |{"Network": "10.244.0.0/16","Backend": {"Type": "vxlan"}}---apiVersion: apps/v1kind: DaemonSetmetadata:name: kube-flannel-ds-amd64namespace: kube-systemlabels:tier: nodeapp: flannelspec:selector:matchLabels:app: flanneltemplate:metadata:labels:tier: nodeapp: flannelspec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: beta.kubernetes.io/osoperator: Invalues:- linux- key: beta.kubernetes.io/archoperator: Invalues:- amd64hostNetwork: truetolerations:- operator: Existseffect: NoScheduleserviceAccountName: flannelinitContainers:- name: install-cniimage: lizhenliang/flannel:v0.11.0-amd64command:- cpargs:- -f- /etc/kube-flannel/cni-conf.json- /etc/cni/net.d/10-flannel.conflistvolumeMounts:- name: cnimountPath: /etc/cni/net.d- name: flannel-cfgmountPath: /etc/kube-flannel/containers:- name: kube-flannelimage: lizhenliang/flannel:v0.11.0-amd64command:- /opt/bin/flanneldargs:- --ip-masq- --kube-subnet-mgrresources:requests:cpu: "100m"memory: "50Mi"limits:cpu: "100m"memory: "50Mi"securityContext:privileged: falsecapabilities:add: ["NET_ADMIN"]env:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespacevolumeMounts:- name: runmountPath: /run/flannel- name: flannel-cfgmountPath: /etc/kube-flannel/volumes:- name: runhostPath:path: /run/flannel- name: cnihostPath:path: /etc/cni/net.d- name: flannel-cfgconfigMap:name: kube-flannel-cfg
查看节点状态
xxxxxxxxxxkubectl get node
查看系统pod状态
xxxxxxxxxxkubectl get pods -n kube-system
简介: 带你5分钟基于K8S集群部署你的第一个K8S应用
xxxxxxxxxxkubectl cluster-info
xxxxxxxxxxkubectl get node

xxxxxxxxxxkubectl get pod -A

部署第一个K8S应用-Nginx,并通过公网ip访问
xxxxxxxxxxkubectl create deployment xdclass-nginx --image=nginx:1.23.0
xxxxxxxxxxkubectl get deployment,pod,svc

xxxxxxxxxxkubectl expose deployment xdclass-nginx --port=80 --type=NodePort
xxxxxxxxxxkubectl get pod,svc

在浏览器访问, 工作节点开放端口31512,访问工作节点ip:31512(网络安全组记得开放31512端口)



注意

愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介:Kubernetes常见资源管理命令介绍
概念
使用kubectl来管理资源
kubectl用法:
xxxxxxxxxxkubectl [command] [TYPE] [NAME] [flags]
例子
xxxxxxxxxx#获取全部节点kubectl get node#获取全部podkubectl get pod#查看某个pod内容kubectl get pod pod_name#获取全部名称空间kubectl get ns#查看创建的资源kubectl get pod,svc,deploy# 删除nginx pod,如果是靠deploy控制器创建的pod, 直接删除则会自动创建新的;kubectl delete pod pod名称# 如果需要删除则直接删除depoly控制器即可,pod会被删除
资源管理方式:
命令式对象管理:直接使用命令去操作资源
xxxxxxxxxxkubectl run 资源名称 --image=镜像名称 --port=端口号例子:kubectl run xdclass-nignx-pod --image=nginx:1.23.0 --port=80kubectl create deployment xdclass-nginx --image=nginx:1.23.0
命令式对象配置:通过命令配置和配置文件去操作资源
xxxxxxxxxxkubectl create -f 配置文件名称.yaml
声明式对象配置:通过apply和配置文件操作资源
xxxxxxxxxxkubectl apply -f 配置文件名称.yaml
yaml例子
xxxxxxxxxxapiVersion: apps/v1kind: Deploymentmetadata:name: nginx-deploymentlabels:app: nginx-deploymentspec:replicas: 1selector:matchLabels:app: nginx-podtemplate:metadata:labels:app: nginx-podspec:containers:- name: nginximage: nginx:1.23.0imagePullPolicy: IfNotPresentports:- containerPort: 80
xxxxxxxxxxapiVersion: v1kind: Podmetadata:name: nginxspec:containers:- image: nginx:1.23.0name: podports:- name: nginx-portcontainerPort: 80protocol: TCP
kubectl create 和 kubectl apply的区别:
简介:Kubernetes资源文件yaml参数介绍
yaml介绍
yaml是一个类似 XML、JSON 的标记性语言。它强调以数据为中心,并不是以标识语言为重点。
例如SpringBoot的配置文件application.yml也是一个yaml格式的文件
语法格式:
---分隔
yaml文件的编写:
不需要从零手写,快速编写yaml文件,通过命令导出新的yaml文件
xxxxxxxxxx#创建nginx资源文件并且不启动资源kubectl create deployment xdclass-nginx --image=nginx:1.23.0 -o yaml --dry-run=client > nginx.yaml#查看nginx.yamlcat nginx.yaml
精简版 yaml
xxxxxxxxxxapiVersion: apps/v1kind: Deploymentmetadata:creationTimestamp: nulllabels:app: xdclass-nginxname: xdclass-nginxspec:replicas: 1selector:matchLabels:app: xdclass-nginxstrategy: {}template:metadata:creationTimestamp: nulllabels:app: xdclass-nginxspec:containers:- image: nginx:1.23.0name: nginxresources: {}status: {}
pod的yaml文件示例
yaml文件示例:
xxxxxxxxxx# pod的最基础的yaml文件最少需要以下的几个参数apiVersion: v1 # API版本号,注意:具有多个,不同的对象可能会使用不同APIkind: Pod # 对象类型,podmetadata: # 元数据name: string # POD名称namespace: string # 所属的命名空间spec: # specification of the resource content(资源内容的规范)containers: # 容器列表- name: string # 容器名称image: string # 容器镜像
常用字段含义
必须存在的属性
| 参数名 | 字段类型 | 说明 |
|---|---|---|
| version | String | k8s API的版本,可使用kubectl api-versions命令查询 |
| kind | String | 这里指定k8s资源的类型,比如Pod、Deployment |
| metadata | Object | 元数据对象,固定写值metadata |
| metadata-name | String | 元数据对象的名字,比如命名pod的名字 |
| metadata-namespace | String | 元数据对象的命名空间 |
| spec | Object | 详细定义对象,固定值写Spec |
| spec.container[] | list | spec对象的容器列表定义 |
| spec.container[].name | String | 容器对象的名字 |
| spec.container[].image | String | 定义要用到的对象名称 |
spec主要对象【大体知道即可】
| 参数名 | 字段类型 | 说明 |
|---|---|---|
| spec.containers[].name | String | 定义容器的名字 |
| spec.containers[].image | String | 定义要用到的镜像名称 |
| spec.containers[].imagePullPolicy | String | 定义镜像拉取策略,有Always、Never、IfNotPresent三个值可选(1)Always:意思是每次都尝试重新拉取镜像 (2)Never:表示仅使用本地镜像 (3)IfNotPresent:如果本地有镜像就使用本地镜像,没有就拉取在线镜像。 上面三个值都没设置的话,默认是Always。 |
| spec.containers[].command[] | List | 指定容器启动命令,因为是数组可以指定多个,不指定则使用镜像打包时使用的启动命令。 |
| spec.containers[].args[] | List | 指定容器启动命令参数,因为是数组可以指定多个。 |
| spec.containers[].workingDir | String | 指定容器的工作目录 |
| spec.containers[].volumeMounts[] | List | 指定容器内部的存储卷配置 |
| spec.containers[].volumeMounts[].name | String | 指定可以被容器挂载的存储卷的名称 |
| spec.containers[].volumeMounts[].mountPath | String | 指定可以被容器挂载的存储卷的路径 |
| spec.containers[].volumeMounts[].readOnly | String | 设置存储卷路径的读写模式,ture 或者false,默认为读写模式 |
| spec.containers[].ports[] | List | 指定容器需要用到的端口列表 |
| spec.containers[].ports[].name | String | 指定端口名称 |
| spec.containers[].ports[].containerPort | String | 指定容器需要监听的端口号 |
| spec.containers[].ports[].hostPort | String | 指定容器所在主机需要监听的端口号,默认跟上面containerPort相同,注意设置了hostPort 同一台主机无法启动该容器的相同副本(因为主机的端口号不能相同,这样会冲突) |
| spec.containers[].ports[].protocol | String | 指定端口协议,支持TCP和UDP,默认值为TCP |
| spec.containers[].env[] | List | 指定容器运行前需设置的环境变量列表 |
| spec.containers[].env[].name | String | 指定环境变量名称 |
| spec.containers[].env[].value | String | 指定环境变量值 |
| spec.containers[].resources | Object | 指定资源限制和资源请求的值(这里开始就是设置容器的资源上限) |
| spec.containers[].resources.limits | Object | 指定设置容器运行时资源的运行上限 |
| spec.containers[].resources.limits.cpu | String | 指定CPU的限制,单位为core数,将用于 docker run --cpu-shares参数(这里前面文章Pod资源限制有讲过) |
| spec.containers[].resources.limits.memory | String | 指定MEM内存的限制,单位为MIB、GiB |
| spec.containers[].resources.requests | Object | 指定容器启动和调度时的限制设置 |
| spec.containers[].resources.requests.cpu | String | CPU请求,单位为core数,容器启动时初始化可用数量 |
| spec.containers[].resources.requests.memory | String | 内存请求,单位为MIB、GiB,容器启动的初始化可用数量 |
| 参数名 | 字段类型 | 说明 |
|---|---|---|
| spec.volumes[].name | String | 定义Pod的共享存储卷的名称,容器定义部分的spec.containers[].volumeMounts[].name的值跟这里是一样的。 |
| spec.volumes[].emptyDir | Object | 指定Pod的临时目录,值为一个空对象:emptyDir:{} |
| spec.volumes[].hostPath | Object | 指定挂载Pod所在宿主机的目录 |
| spec.volumes[].hostPath.path | String | 指定Pod所在主机的目录,将被用于容器中mount的目录 |
| spec.volumes[].secret | Object | 指定类型为secret的存储卷,secret意为私密、秘密的意思,很容易理解,它存储一些密码,token或者秘钥等敏感安全文件。挂载集群预定义的secret对象到容器内部。 |
| spec.volumes[].configMap | Object | 指定类型为configMap的存储卷,表示挂载集群预定义的configMap对象到容器内部。 |
| spec.volumes[].livenessProbe | Object | 指定Pod内容器健康检查的设置,当探测无响应几次后,系统将自动重启该容器。这个在前面的文章中有说,具体可以设置:exec、httpGet、tcpSocket。 |
| spec.volumes[].livenessProbe.exec | Object | 指定Pod内容器健康检查的设置,确定是exec方式 |
| spec.volumes[].livenessProbe.exec.command[] | String | 指定exec方式后需要指定命令或者脚本,用这个参数设置 |
| spec.volumes[].livenessProbe.httpGet | Object | 指定Pod内容器健康检查的设置,确定是httpGet方式 |
| spec.volumes[].livenessProbe.tcpSocket | Object | 指定Pod内容器健康检查的设置,确定是tcpSocket方式 |
| spec.volumes[].livenessProbe.initialDelaySeconds | Number | 容器启动完成后手册探测的时间设置,单位为s |
| spec.volumes[].livenessProbe.timeoutSeconds | Number | 对容器健康检查的探测等待响应的超时时间设置,单位为S,默认为1s。若超过该超时时间设置,则认为该容器不健康,会重启该容器。 |
| spec.volumes[].livenessProbe.periodSeconds | Number | 对容器健康检查的定期探测时间设置,单位为S,默认10s探测一次。 |
简介:Kubernetes常见资源类型和缩写
xxxxxxxxxx#查看资源kubectl api-resources#查看命令帮助kubectl --help
常用资源分类和缩写
节点 nodes ,缩写 no
名称空间 namespaces,缩写ns
pod资源 pods, 缩写 po
pod控制器
服务发现
存储资源
| 命令分类 | 命令 | 翻译 |
|---|---|---|
| 基本命令 | create | 创建资源 |
| delete | 删除资源 | |
| edit | 编辑资源 | |
| get | 获取资源 | |
| patch | 更新资源 | |
| explain | 解释资源 | |
| 运行和调试 | run | 运行指定的镜像 |
| expose | 暴露服务 | |
| describe | 描述资源内部信息 | |
| logs | 打印容器在 pod 中的日志 | |
| attach | 进入运行中的容器 | |
| exec | 执行容器中的一个命令 | |
| cp | 在Pod内外复制文件 | |
| scale | 扩容/缩容Pod的数量 | |
| autoscale | 扩容/缩容Pod的数量 | |
| 高级命令 | apply | rc |
| label | 标签 | |
| 其他命令 | cluster-info | 集群信息 |
| version | 版本 |
愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介:Kubernetes名称空间介绍和资源操作实战
什么是名称空间Namespace
Kubernetes 会创建四个初始NameSpace名称空间:
default
kube-system
kube-public
kube-node-lease
查看所有命令空间
xxxxxxxxxxkubectl get namespace缩写kubectl get ns

命名空间操作
xxxxxxxxxx# 创建新命名空间kubectl create ns dev# 查看命名空间详情kubectl describe ns dev# 指定输出格式 命令:kubectl get ns ns名称 -o 格式参数, 常见的是wide、json、yaml# 输出命名空间详细信息kubectl get ns dev -o yaml# 删除命名空间kubectl delete ns dev# 基于配置文件方式 namespace-dev.yamlapiVersion: v1kind: Namespacemetadata:name: dev创建:kubectl create -f namespace-dev.yaml创建:kubectl apply -f namespace-dev.yaml删除:kubectl delete -f namespace-dev.yaml
简介:K8S中最小的单位Pod资源讲解实战
Pod
Pod是一组容器, 在K8S中,最小的单位是Pod, 一个Pod可以包含多个容器,但通常情况下我们在每个Pod中仅使用一个容器,可以把Pod理解成豌豆荚, Pod内的每个容器是一颗颗豌豆
Pod 的核心是运行容器,必须指定容器引擎,比如 Docker是其中一种技术
分类

Pod运行容器数量
Pod网络

Pod存储
K8S集群中的系统组件都是以Pod方式运行的
xxxxxxxxxxkubectl get pod -n kube-system
命令
xxxxxxxxxx#查看创建的资源kubectl get pod,deploy# 删除nginx pod,如果是靠deploy控制器创建的pod, 直接删除则会自动创建新的;kubectl delete pod pod名称 -n 名称空间#通过控制器创建pod,则删除控制器即可kubectl delete pod控制器名称 -n 名称空间# 运行pod,指定名称空间kubectl run xdclass-nignx-pod --image=nginx:1.23.0 --port=80 --namespace dev# 通过 deployment控制器导出yaml文件,指定名称空间kubectl create deployment xdclass-nginx --image=nginx:1.23.0 --namespace dev -o yaml --dry-run=client > nginx.yaml#一次性部署3个pod,修改nginx.yaml 下面的从 1 改为 3#使用 kubectl apply -f nignx.yamlspec:replicas: 3

访问
xxxxxxxxxx#查看某个名称空间下 pod 更多信息kubectl get pod -n dev -o wide#访问pod,同个集群下面,master和node节点都可以访问(同个K8S内部网络)curl 10.244.1.20#备注,如果使用了Service,即NodePort端口,开放了网络安全组则外网也可以访问

简介:Kubernetes中Pod资源进阶底层讲解
Pod底层原型
每个Pod中都可以包含一个或者多个容器,这些容器可以分为两类
用户程序所在的容器,数量可多可少
Pause容器,这是每个Pod都会有的一个根容器,它的作用有两个:
以它为依据,评估整个Pod的健康状态
可以在根容器上设置Ip地址,其它容器都此Ip(Pod IP),以实现Pod内部的网路通信
实现机制
通过共享网络
通过共享存储

pod镜像拉取策略imagesPullPolicy
xxxxxxxxxx- Always:每次创建pod都会重新拉取一次镜像
xxxxxxxxxx- Never:pod永远不会主动拉取这个镜像

pod资源限制
说明:
xxxxxxxxxxresources:requests:memory:"内存大小"cpu:"cpu占用大小"limits:memory:"内存占用大小"cpu:"cpu占用大小"——————————————————————————————————————————————CPU 资源以 CPU 单位度量。Kubernetes 中的一个 CPU 等同于:1 个 AWS vCPU1 个 Azure vCore例如 100m CPU、100 milliCPU 和 0.1 CPU 都相同文档地址:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/assign-cpu-resource/

pod的创建流程
xxxxxxxxxx- kubectl向apiserver发送创建pod的请求- apiserver把pod的创建信息存储到etcd进行保存- scheduler监听到未绑定node的pod资源,通过调度算法对该pod资源选定一个合适的node进行绑定,然后响应给apiserver,更新pod状态并存储到etcd中- 在绑定的node中,Controller-Manager通知kubelet收到分配到自身节点上的pod,调用容器引擎api创建容器,并把容器状态响应给apiserver

Pod的调度策略
在默认情况下,一个Pod在哪个Node节点上运行,是由Scheduler组件采用相应的算法计算出来的,这个过程是不受人工控制的。但是在实际使用中,这并不满足的需求,因为很多情况下,我们想控制某些Pod到达某些节点上,那么应该怎么做呢?这就要求了解k8s对Pod的调度规则
影响pod调度的因素:
pod资源限制:scheduler根据requests找到足够大小的node进行调度
节点选择器标签(nodeSelector)
xxxxxxxxxxnodeSelector:env_role:dev/prod

简介:Kubernetes标签Label和标签选择器实战
Label
K8S提供了一种机制来为资源进行分类,那就是Label(标签),同一类资源会拥有相同的标签
具体形式是key-value的标记对,可以在创建资源的时候设置,也可以在后期添加和修改
可以附加到各种资源对象上,如Node,Pod,Service,RC等,一个资源拥有多个标签,可以实现不同维度的管理
给某个资源对象定义一个Label,就相当于给它打了一个标签,可以通过Label Selector(标签选择器)查询和筛选拥有某些Label的资源对象,K8S通过这种方式实现了类似SQL的对象查询机制
每个资源都存在多维度属性
xxxxxxxxxx版本标签:"release" : "stable" , "release" : "canary"...环境标签:"environment" : "dev" , "environment" : "production"架构标签:"tier" : "frontend" , "tier" : "backend" , "tier" : "middleware"分区标签:"partition" : "customerA" , "partition" : "customerB"...
应用场景


标签选择器Label selector
是Kubernetes核心的分组机制,通过label selector客户端/用户能够识别一组有共同特征或属性的资源对象
对应的资源打上标签后,可以使用标签选择器过滤指定的标签
标签选择器目前有两个
matchLabels 用于定义一组Label , 基于等值关系(等于、不等于) ,类似于SQL语句中的=或!=
matchExpressions 基于集合关系(属于、不属于、存在) ,类似于SQL语句中的in或 not in
备注
操作
xxxxxxxxxx# 通过 deployment控制器导出yaml文件,指定名称空间kubectl create deployment xdclass-nginx --image=nginx:1.23.0 --namespace dev -o yaml --dry-run=client > nginx.yaml#命令默认不会列出任何标签kubectl get pods# 使用 --show-labels 选项来查看kubectl get pod -n dev --show-labels# 查看 deploy控制器标签kubectl get deploy -n dev --show-labels# 查看 pod 标签kubectl get pod -n dev --show-labels# 查看node节点标签kubectl get node --show-labels#给Pod资源打标签kubectl label pod pod名称 -n dev version=1.0例子:kubectl label pod xdclass-nginx-859bdb9994-kglj8 -n dev version=1.0#给Pod资源更新标签kubectl label pod pod名称 -n dev version=2.0 --overwrite例子:kubectl label pod xdclass-nginx-859bdb9994-kglj8 -n dev version=2.0 --overwrite#使用标签选择器kubectl get pod -l "version=2.0" -n dev --show-labelskubectl get pod -l "version!=2.0" -n dev --show-labels#删除标签 语法 kubectl label pod pod名称 -n dev 标签名-kubectl label pod pod名称 -n dev version-例子kubectl label pod xdclass-nginx-859bdb9994-kglj8 -n dev version-
xxxxxxxxxxapiVersion: apps/v1kind: Deploymentmetadata:creationTimestamp: nulllabels:app: xdclass-nginxname: xdclass-nginxnamespace: devspec:replicas: 2selector:matchLabels:app: xdclass-nginxstrategy: {}template:metadata:creationTimestamp: nulllabels:app: xdclass-nginxspec:containers:- image: nginx:1.23.0name: nginxresources: {}status: {}
简介:Kubernetes的NodeSelector标签选择器实战
nodeSelector
xxxxxxxxxx# 查看node节点标签kubectl get node --show-labels
配置文件
xxxxxxxxxxapiVersion: v1kind: Podmetadata:name: xdclass-nginxspec:containers:- name: nginximage: nginx:1.23.0imagePullPolicy: IfNotPresentnodeSelector:env: test
xxxxxxxxxx#创建podkubectl apply -f nginx.yaml#查看pod资源kubectl get pod# 当Pod 一直处于 Pending 状态时,说明该 Pod 还未被调度到某个节点上# Pod 中 nodeSelector 指定了节点 Label,调度器将只考虑调度 Pod 到包含该 Label 的 Node 上# 当不存在符合该条件的 Node 时,Pod 将无法被调度#给Node资源打标签,不能给master打标签kubectl label node node名称 env=testkubectl label node izwz90pegu9budx5tk4rv0z env=test#删除 node的标签 kubectl label node 删除指定的labels(标签 key 接 - 号即可)kubectl label node node名称 env-kubectl label node izwz90pegu9budx5tk4rv0z env-
愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介:Kubernetes的Pod控制器讲解实战
Pod Controller控制器

Pod Controller的类型概述
ReplicaSet
rs,主要是控制由其管理的pod,使pod副本的数量始终维持在预设的个数
Deployment

DaemonSet
StatefulSet
xxxxxxxxxx<statefulset name>-<ordinal index>
Horizontal Pod Autoscaler

Job
Cronjob:

简介:K8S核心控制器之ReplicaSet控制器和控制器模板介绍
备注
ReplicaSet
rs,主要是控制由其管理的pod,使pod副本的数量始终维持在预设的个数
可控制器Yaml模板介绍
xxxxxxxxxxapiVersion: apps/v1 # 版本号kind: ReplicaSet #资源文件metadata: # 元对象信息name: xdclass-rs #rs控制器名称namespace: dev #名称空间spec: #具体详情replicas: 5 #副本数量selector: # 选择器,指定rs控制器管理哪些pod资源matchLabels: # 标签匹配规则app: xdclass-nginx-pod #标签key是app,值是xdclass-nginx-podtemplate: # pod模板,当数量不满足的时候,根据下面编码创建pod副本metadata: # 元对象信息labels: # pod资源标签app: xdclass-nginx-podspec: #具体详情containers: # 容器数组列表- name: xdclass-nginx #容器名称image: nginx:1.23.0 # 镜像和版本
xxxxxxxxxxapiVersion: apps/v1kind: ReplicaSetmetadata:name: xdclass-rsnamespace: devspec:replicas: 5selector:matchLabels:app: xdclass-nginx-podtemplate:metadata:labels:app: xdclass-nginx-podspec:containers:- name: xdclass-nginximage: nginx:1.23.0
xxxxxxxxxx#创建kubectl apply -f replicaset-nginx.yaml
xxxxxxxxxx#查看kubectl get pods,deploy,replicaset -o wide -n dev# 命令行缩容kubectl scale rs xdclass-rs --replicas=2 -n dev# 删除,可以直接删除rs;也可以通过yaml删除kubectl delete -f replicaset-nginx.yaml
简介:K8S核心控制器之Deployment控制器实战
Deployment

配置文件 deploy-nginx-pod.yaml
xxxxxxxxxxapiVersion: apps/v1kind: Deploymentmetadata:name: xdclass-deploynamespace: devspec:replicas: 5selector:matchLabels:app: xdclass-nginx-podtemplate:metadata:labels:app: xdclass-nginx-podspec:containers:- name: xdclass-nginximage: nginx:1.23.0
xxxxxxxxxx#创建kubectl apply -f deploy-nginx-pod.yaml# 查看deploymentkubectl get deployment -n dev#查看kubectl get pods,deploy,replicaset -o wide -n dev# 删除,通过yaml删除kubectl delete -f deploy-nginx-pod.yaml
检查集群中的 Deployment 时,所显示的字段有:
NAME 列出了集群中 Deployment 的名称。READY 显示应用程序的可用的“副本”数,格式是“就绪个数/期望个数”。UP-TO-DATE 显示为了达到期望状态已经更新的副本数。AVAILABLE 显示可用的副本数。AGE 应用程序运行的时间。
简介:Deployment控制器rollout实现滚动升级
Deployment控制器核心
K8S的Deployment控制器滚动升级 (金丝雀发布 or 灰度发布)
对各个实例批次进行单独更新,而非同一时刻对所有实例进行全部更新,达到不中断服务的更新升级方式
Deployment控制器 给旧版本(old_rs)副本数减少至0、给新版本(new_rs)副本数量增至期望值(replicas)
Deployment更新有两种方式
xxxxxxxxxxspec:strategy: # 策略type: RollingUpdate
Recreate : 删除全部旧的pod,然后创建新的pod
RollingUpdate:滚动升级更新,删除部分,更新部分,在整个更新过程中,存在两个版本的pod
xxxxxxxxxx升级过程中不可用Pod的最大数量,默认为25%在滚动更新时,我们可以忍受多少个 Pod 无法提供服务值越小越能保证服务稳定,更新越平滑
xxxxxxxxxx升级过程中可以超过期望的Pod的最大数量,默认为25%;在滚动更新时,可以有多少个额外的 Pod值调的越大,副本更新速度越快
例子 deploy-rollout.yaml
xxxxxxxxxxMaxUnavailable为0, 在新 Pod 启动并就绪之前,不要关闭任何旧PodMaxSurge 为100%, 立即启动所有新 Pod,也就是有足够的资源希望尽快完成更新。默认两个值都是 25%如果更新一个 100 Pod 的 Deployment,会立刻创建 25 个新 Old,同时会关闭 25 个旧 Pod;每次有 Pod 启动就绪,就可以关闭旧 Pod
xxxxxxxxxxapiVersion: apps/v1kind: Deploymentmetadata:name: xdclass-deploynamespace: devspec:replicas: 5revisionHistoryLimit: 5 #保留历史版本5个strategy:type: RollingUpdateselector:matchLabels:app: xdclass-nginx-podtemplate:metadata:labels:app: xdclass-nginx-podspec:containers:- name: xdclass-nginximage: nginx:1.23.0
查看控制器参数
xxxxxxxxxxkubectl describe deploy xdclass-deploy -n dev

滚动升级
xxxxxxxxxxkubectl set image deployment/xdclass-deploy xdclass-nginx=nginx:1.15.8 -n dev备注追加 --record 以保存正在更改资源的 kubectl 命令,方便查看history版本列表修改命令kubectl set image deployment/xdclass-deploy xdclass-nginx=nginx:1.15.8 -n dev --record=truekubectl set image deployment/xdclass-deploy xdclass-nginx=nginx:1.23.0 -n dev --record=true
xxxxxxxxxxkubectl get pods -n dev -w
发布回滚
kubectl rollout 版本升级相关介绍
查看历史版本列表
xxxxxxxxxxkubectl rollout history deployment/xdclass-deploy -n dev
xxxxxxxxxxkubectl rollout history deployment/xdclass-deploy -n dev --revision=2
xxxxxxxxxxkubectl rollout undo deployment/xdclass-deploy -n dev
xxxxxxxxxxkubectl rollout status deployment/xdclass-deploy -n dev
xxxxxxxxxxkubectl rollout undo deployment/xdclass-deploy -n dev --to-revision=2

删除deployment
xxxxxxxxxxkubectl delete -f deploy-nginx-pod.yaml
简介:K8S核心控制器之DaemonSet控制器实战
DaemonSet(节点级别的pod)
案例 daemonset-nginx.yaml
xxxxxxxxxxapiVersion: apps/v1kind: DaemonSetmetadata:name: xdclass-dsnamespace: devspec:selector:matchLabels:app: xdclass-nginx-podtemplate:metadata:labels:app: xdclass-nginx-podspec:containers:- name: xdclass-nginximage: nginx:1.23.0imagePullPolicy: IfNotPresent
命令验证
xxxxxxxxxx#创建kubectl apply -f daemonset-nginx.yaml#只有一个节点,多个节点的话,每个节点都有一个podkubectl get pod,deploy,rs,ds -n dev
简介:K8S核心控制器之Job控制器实战
Job控制器
参数讲解
xxxxxxxxxxapiVersion: batch/v1kind: Jobmetadata:name: xdclass-jobnamespace: devspec:parallelism: 2 #job并发运行Pods的数量,默认 1completions: 3 #job需要成功运行Pods的次数,默认 1backoffLimit: 5 #job失败后进行重试的次数,默认是6activeDeadlineSeconds: 100 #job运行超时时间,当job超过timeout时间,则job的状态也会更新为failedtemplate:spec:restartPolicy: Never #job重启策略,OnFailure或Nevercontainers:- name: demoimage: busybox:1.35.0# 容器的启动命令列表,在pod中的容器初始化完毕后运行命令command: ["echo","hello xdclass.net k8s job"]
BusyBox
案例实战
xxxxxxxxxxapiVersion: batch/v1kind: Jobmetadata:name: xdclass-jobspec:parallelism: 2completions: 3backoffLimit: 5activeDeadlineSeconds: 100template:spec:restartPolicy: Nevercontainers:- name: demoimage: busybox:1.35.0command: ["echo","hello xdclass.net k8s job"]
xxxxxxxxxxkubectl get job -n dev -o widekubectl get pods -o wide#查看日志kubectl logs xdclass-job-75xfb

愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介:带你走近K8S沐足店的服务Service


Service

Service (服务)就是用来解决这个问题的, 对外服务的统一入口,防止pod失联,定义一组pod的访问策略(服务发现、负载均衡)
一个Service可以看作一组提供相同服务的Pod的对外访问接口,作用于哪些Pod是通过标签选择器来定义的
例子
service分类
ClusterIP
NodePort
LoadBalancer(花钱的方案)
ExternalName(很少)
service和pod的关系
xxxxxxxxxxspec: # 描述selector: # 标签选择器,确定当前service代理控制哪些podapp: xdclass-nginx
yaml模板文件
xxxxxxxxxxapiVersion: v1kind: Servicemetadata:creationTimestamp: nullname: xdclass-svcspec:ports:- port: 80 # service服务端口protocol: TCPtargetPort: 80 # pod端口,常规和容器内部端口一致selector:app: xdclass-nginx-podstatus:loadBalancer: {}
简介:K8S里面的port-targetPort -nodePort-containerPort 你知道怎么区分不
关于K8S中端口的概念区分
port
nodePort
targetPort
containerPort

总结
xxxxxxxxxxapiVersion: v1kind: Podmetadata:name: nginxnamespace: devlabels:app: nginxspec:containers:- name: nginximage: nginx:1.20imagePullPolicy: IfNotPresentports:- containerPort: 80 #容器端口---apiVersion: apps/v1kind: Servicemetadata:name: nginxspec:type: NodePort # 有配置NodePort,外部可访问k8s中的服务 ,ports:- name: nginxport: 80 # 服务service的访问端口protocol: TCPtargetPort: 80 # pod端口,映射到容器端口nodePort: 30015 # NodePort,通过nodeport类型的service暴露给集群外部访问selector:app: nginx
简介:K8S服务Service的ClusterIP实战
xxxxxxxxxxkubectl apply -f deploy-nginx-pod.yaml
xxxxxxxxxxkubectl get deployment,pod,svc -n dev -o wide

xxxxxxxxxxkubectl expose deploy xdclass-deploy --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n dev
xxxxxxxxxxkubectl get deployment,pod,svc -n dev -o wide

xxxxxxxxxxkubectl describe svc svc-nginx1 -n dev

简介:K8S服务Service的NodePort和EndPoint实战
NodePort
xxxxxxxxxxkubectl expose deploy xdclass-deploy --name=svc-nodeport-nginx1 --type=NodePort --port=80 --target-port=80 -n dev

在浏览器访问, 工作节点开放端口31325,访问工作节点ip:31325(网络安全组记得开放31325端口)
master、node节点访问这个 开放的端口都可以
Kubeadm部署,暴露端口对外服务,会随机选端口,默认范围是30000~32767,可以修改指定范围


xxxxxxxxxxkubectl describe svc svc-nodeport-nginx1 -n dev

Endpoint(缩写是ep)
xxxxxxxxxxkubectl get ep svc-nodeport-nginx1 -n dev -o wide

大家的疑惑点,service如何决定分发请求到后端的Pod?

kubernetes提供了两种负载均衡策略
验证
xxxxxxxxxx#查看全部pod和ipkubectl get pods -n dev -o wide#修改pod里面容器nginx的默认静态页面,内容为Pod所在的ipkubectl exec -it xdclass-deploy-64967f6b67-p66wh -n dev /bin/shecho "xdclass.net 5" > /usr/share/nginx/html/index.html# curl访问ip+port 或 浏览器直接访问
愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介: K8S数据存储Volume讲解和EmptyDir实战
需求
容器的生命周期可能很短,会被频繁地创建和销毁,容器 中的文件在磁盘上是临时存放的,这给容器中运行的较重要的应用程序带来一些问题
Kubernetes 卷(Volume) 这一抽象概念能够解决这两个问题,卷的核心是包含一些数据的目录,Pod 中的容器可以访问该目录
总结:
Volume常见的类型:
EmptyDir
当 Pod 指定到某个节点上时,首先创建的是一个 emptyDir 卷,只要 Pod 在该节点上运行卷就一直存在
当 Pod 因为某些原因被从节点上删除时,emptyDir 卷中的数据也会永久删除
容器崩溃并不会导致 Pod 被从节点上移除,所以容器崩溃时 emptyDir 卷中的数据是安全的。
用途
案例 volume-emptydir.yaml , pod里面定义两个容器,一个产生日志,一个是读日志输出到控制台

xxxxxxxxxxapiVersion: v1kind: Podmetadata:name: xdclass-volume-emptydirnamespace: devspec:containers:- name: xdclass-nginximage: nginx:1.20ports:- containerPort: 80volumeMounts: # 将nginx-log-volume挂在到nginx容器中,对应的目录为 /var/log/nginx- name: nginx-log-volumemountPath: /var/log/nginx- name: xdclass-busyboximage: busybox:1.35.0command: ["/bin/sh","-c","tail -f /usr/local/test/access.log"] # 容器启动后初始命令,读取指定文件中内容volumeMounts: # 将nginx-log-volume挂在到busybox容器中,对应的目录为 /logs- name: nginx-log-volumemountPath: /usr/local/testvolumes: # 这里声明volume存储劵, name为nginx-log-volume,类型是emptyDir- name: nginx-log-volumeemptyDir: {}
xxxxxxxxxx#创建kubectl apply -f volume-emptydir.yaml#查看kubectl get pods -n dev -o wide#访问nignx 产生访问日志curl ip#查看容器输出 -f 后是 pod的名称kubectl logs -f xdclass-volume-emptydir -n dev -c xdclass-busybox
xxxxxxxxxxkubectl delete -f volume-emptydir.yaml
简介: K8S数据存储Volume之hostPath实战
HostPath
emptyDir中数据没做持久化,随着Pod的结束而销毁,需要持久化到磁盘则选其他方式
hostPath类型的磁盘就是挂在了主机的一个文件或者目录
案例

HostPath有多种类型,列举常见几个
案例 volume-hostpath.yaml
xxxxxxxxxxapiVersion: v1kind: Podmetadata:name: xdclass-volume-hostpathnamespace: devspec:containers:- name: xdclass-nginximage: nginx:1.20ports:- containerPort: 80volumeMounts: # 将nginx-log-volume挂在到nginx容器中,对应的目录为 /var/log/nginx- name: nginx-log-volumemountPath: /var/log/nginx- name: xdclass-busyboximage: busybox:1.35.0command: ["/bin/sh","-c","tail -f /usr/local/test/access.log"] # 容器启动后初始命令,读取指定文件中内容volumeMounts: # 将nginx-log-volume挂在到busybox容器中,对应的目录为 /logs- name: nginx-log-volumemountPath: /usr/local/testvolumes: # 这里声明volume存储劵, name为nginx-log-volume,类型是hostPath- name: nginx-log-volumehostPath:path: /usr/local/testtype: DirectoryOrCreate #如果给定路径不存在,将根据需要在那里创建一个空目录
xxxxxxxxxx#创建kubectl apply -f volume-hostpath.yaml#查看kubectl get pods -n dev -o wide#访问nignx 产生访问日志curl ip#查看容器输出 -f 后是 pod的名称kubectl logs -f xdclass-volume-hostpath -n dev -c xdclass-busybox#去节点对应的目录查看文件是否有,即pod运行的节点,主节点上是没的!!!!ls /usr/local/test
xxxxxxxxxxkubectl delete -f volume-hostpath.yaml
emptyDir和hostPath对比
简介: K8S数据存储ConfigMap实战
需求
ConfigMap介绍(缩写cm)
使用方式
xxxxxxxxxx格式如下kubectl create configmap NAME --from-literal=key1=value1 --from-literal=key2=value2
实操
xxxxxxxxxxkubectl create configmap xdclass-config --from-literal=account=xdclass --from-literal=password=123456#查看[root@iZwz90pegu9budx5tk4ruzZ ~]# kubectl get cm xdclass-config -o yamlapiVersion: v1data:account: xdclasspassword: passwordkind: ConfigMapmetadata:creationTimestamp: "2022-07-04T06:36:18Z"name: xdclass-confignamespace: defaultresourceVersion: "1716676"selfLink: /api/v1/namespaces/default/configmaps/xdclass-configuid: 6ae2890e-fad3-452c-9179-78dd63ddbbba
xxxxxxxxxxapiVersion: v1kind: ConfigMapmetadata:name: xdclass-configmapnamespace: devdata:info:username:xdclasspassword:123456
xxxxxxxxxx#创建kubectl create -f configmap.yaml# 查看configmap详情kubectl describe cm xdclass-configmap -n dev
xxxxxxxxxxapiVersion: v1kind: Podmetadata:name: pod-configmapnamespace: devspec:containers:- name: nginximage: nginx:1.20volumeMounts: # configmap挂载的目录- name: configmountPath: /configvolumes: # 声明configmap- name: configconfigMap:name: xdclass-configmap
xxxxxxxxxx#创建podkubectl create -f pod-configmap.yaml#查看kubectl get pod pod-configmap -n dev#进入容器kubectl exec -it pod-configmap -n dev -- /bin/sh# cd /config# cat infousername:xdclasspassword:123456
简介: K8S数据存储之Secret实战
需求
Secret
用来保存敏感信息,例如密码、秘钥、证书、OAuth 令牌和 ssh key等
就不需要把这些敏感数据暴露到镜像或者Pod中
Pod 可以用三种方式之一来使用 Secret:
secret有多个类型
dockerconfigjson
Service Account
xxxxxxxxxx#查看kubectl get pod -A | grep 'kube-proxy'#进到容器,加了 -- /bin/bash,不会有警告kubectl exec -it -n kube-system kube-proxy-9wb4g -- /bin/sh#查看ls -l /run/secrets/kubernetes.io/serviceaccountcd /run/secrets/kubernetes.io/serviceaccountcat ca.crt
Opaque
xxxxxxxxxxecho -n 'admin' | base64 #账号echo -n '123456' | base64 #密码#创建secret.yamlapiVersion: v1kind: Secretmetadata:name: mysecrettype: Opaquedata:username: YWRtaW4=password: MTIzNDU2
xxxxxxxxxx#创建kubectl apply -f secret.yaml# 查看secret的信息kubectl get secret# 查看mysecret详细信息kubectl get secret mysecret -o yaml#将secret挂载到Pod的Volume中,创建pod-secret-volume.yamlapiVersion: v1kind: Podmetadata:name: pod-secretspec:containers:- name: nginximage: nginx:1.20volumeMounts: # secret挂载- name: xdclass-configmountPath: /etc/secretvolumes:- name: xdclass-configsecret:secretName: mysecret#创建podkubectl apply -f pod-secret-volume.yaml#查看kubectl get pod -o wide#查看secret, 在pod中的secret信息实际已经被解密kubectl exec -it pod-secret -- /bin/sh#ls /etc/secret#cat /etc/secret/username#cat /etc/secret/password#删除secretkubectl delete secret mysecret
简介: 数据存储NFS网络文件系统搭建实战
什么是NFS(Network File System)
一种基于TCP/IP 传输的网络文件系统协议, 通过使用NFS协议,可以像访问本地目录一样访问远程服务器中的共享资源
NFS服务的实现依赖于RPC (Remote Process Call,远端过程调用)机制,以完成远程到本地的映射过程
一般需要安装nfs-utils、 rpcbind 软件包来提供NFS共享服务,前者用于NFS共享发布和访问,后者用于RPC支持
采用TCP/IP传输网络文件,适合局域网环境,简单操作
NFS 在 K8S Volume里面的作用

部署NFS服务器
下载nfs-util (对应要用到的节点都需要安装,但是不需要启动)
xxxxxxxxxxyum install nfs-utils -y
创建目录(nfs服务器)
xxxxxxxxxx#目录可以自定义mkdir /opt/nfsdata#给路径授权chmod 777 /opt/nfsdata
编辑/etc/exports 配置文件(nfs服务器)
xxxxxxxxxxvim /etc/exports# 目录的读写权限暴露给这个网段的全部主机/opt/nfsdata 172.31.101.0/24(rw,insecure,sync)解释172.31.101.0/24表示的IP范围, 换成32位二进制,四组,每组8位/24 表示前24位不变,后8位由全0变化到全1的过程,也就是由“00000000”变化到“11111111”又因为全0是子网网络地址,全1是子网广播地址,这两个地址是不分配给主机使用的。所以有效的可分配的范围是前24位不变,后8位由“00000001”变化为“11111110”的范围再转换回十进制就是172.31.101.1~172.31.101.254
参数
启动rpcbind(安装nfs依赖包会自动下载)和nfs服务
xxxxxxxxxxsystemctl start rpcbindsystemctl start nfs
验证
简介: K8S数据存储之NF持久卷挂载实战
xxxxxxxxxxapiVersion: v1kind: Podmetadata:name: xdclass-nfsnamespace: devlabels:apps: nginx-nfsspec:containers:- name: nginximage: nginx:1.20ports:- containerPort: 80volumeMounts:- name: logs-volumemountPath: /var/log/nginxvolumes:- name: logs-volumenfs:server: 172.31.101.8 #nfs服务器地址path: /opt/nfsdata #共享文件路径
暴露服务
xxxxxxxxxxkubectl expose pod xdclass-nfs -n dev --port=80 --target-port=80 --type=NodePort
查看nfs服务器的/opt/nfsdata
xxxxxxxxxx[root@iZwz90pegu9budx5tk4ruyZ nfsdata]# lsaccess.log error.log
访问nginx服务并查看nfs日志
xxxxxxxxxxtail -f access.log172.18.123.230 - - [05/Jul/2022:06:56:25 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
简介: K8S高级存储之PV和PVC讲解
Kubernetes 支持的存储插件很多
背景

什么是PV 持久卷(Persistent Volume)
什么是PVC 持久卷声明 (Persistent Volume Claim)
假如存在很多PV, K8S 要用PV的时候直接调用某个PV的话,那如果需要的是存储能力比较大存储资源,所以这个时候需要一个一个去对比pv,这样很耗费资源(因为要满足需求)
PVC是用户存储的一种声明, PVC 可以请求特定的存储空间和访问模式,PVC 消耗的是 PV 资源
PVC必须与对应的PV建立关系,PVC会根据定义的PV去申请
创建pod的时候会附带一个PVC的请求,PVC的请求相当于就是去寻找一个合适的pv
使用逻辑
PV和PVC逻辑
PV 是集群中的【资源】,PVC 是对这些【资源的请求】
PV 和 PVC 之间的相互作用遵循这个生命周期
PV的yaml模板
xxxxxxxxxxapiVersion: v1kind: PersistentVolumemetadata:name: xdclass-pvspec:capacity:storage: 5Gi #存储大小accessModes:#访问模式- ReadWriteOncepersistentVolumeReclaimPolicy: Recycle #回收策略storageClassName: slow #存储类别nfs:#卷插件path: /tmpserver: 172.31.101.8
存储大小:存储大小是可以设置和请求的唯一资源。 未来可能会包含 IOPS、吞吐量等属性
访问模式:用户对资源的访问权限
存储类别:
回收策略(当PV不再被使用了之后的处理策略)
状态( PV 的生命周期有4种不同状态)
PVC的yaml模板
xxxxxxxxxxapiVersion: v1kind: PersistentVolumeClaimmetadata:name: xdclass-pvcnamespace: devspec:accessModes: # 访问模式- ReadWriteManyselector: # 采用label标签对PV选择过滤storageClassName: # 存储类别,设置对应的class的PV才能被系统选出resources: # 需要存储资源的请求requests:storage: 3Gi
简介: K8S高级存储之NFS+PV和PVC案例实战
需求
PV和PVC的使用
搭建nfs环境(nfs服务器,基于上面的nfs):
创建目录
xxxxxxxxxxmkdir /opt/nfsdata/pv1mkdir /opt/nfsdata/pv2chmod 777 /opt/nfsdata/pv1chmod 777 /opt/nfsdata/pv2
修改配置文件
xxxxxxxxxxvim /etc/exports#暴露nfs服务/opt/nfsdata/pv1 172.31.101.0/24(rw,insecure,sync)/opt/nfsdata/pv2 172.31.101.0/24(rw,insecure,sync)
重启nfs
xxxxxxxxxxsystemctl restart nfs
创建两个PV
xxxxxxxxxxapiVersion: v1kind: PersistentVolumemetadata:name: xdclass-pv1spec:capacity:storage: 1GiaccessModes:- ReadWriteManypersistentVolumeReclaimPolicy: Retainnfs:server: 172.31.101.8path: /opt/nfsdata/pv1---apiVersion: v1kind: PersistentVolumemetadata:name: xdclass-pv2spec:capacity:storage: 2GiaccessModes:- ReadWriteManypersistentVolumeReclaimPolicy: Retainnfs:server: 172.31.101.8path: /opt/nfsdata/pv2
查看PV
xxxxxxxxxx[root@iZwz99o60h8sytbhpurjc3Z ~]# kubectl get pv -o wideNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE VOLUMEMODExdclass-pv1 1Gi RWX Retain Available 25s Filesystemxdclass-pv2 2Gi RWX Retain Available 25s Filesystem
创建PVC,使用pvc.yaml (与PV不同,PVC不属于集群资源,拥有自己的名称空间)
xxxxxxxxxxapiVersion: v1kind: PersistentVolumeClaimmetadata:name: xdclass-pvc1namespace: devspec:accessModes:- ReadWriteManyresources:requests:storage: 1Gi---apiVersion: v1kind: PersistentVolumeClaimmetadata:name: xdclass-pvc2namespace: devspec:accessModes:- ReadWriteManyresources:requests:storage: 3Gi
查看pvc
xxxxxxxxxx[root@iZwz99o60h8sytbhpurjc3Z ~]# kubectl apply -f pvc.yamlpersistentvolumeclaim/xdclass-pvc1 createdpersistentvolumeclaim/xdclass-pvc2 created[root@iZwz99o60h8sytbhpurjc3Z ~]# kubectl get pvc -n devNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGExdclass-pvc1 Bound xdclass-pv1 1Gi RWX 6sxdclass-pvc2 Pending 6s
可以发现目前xdclass-pvc1已经与xdclass-pv1绑定了,而xdclass-pvc2却没有绑定
查看pv
xxxxxxxxxx[root@iZwz99o60h8sytbhpurjc3Z ~]# kubectl get pvNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGExdclass-pv1 1Gi RWX Retain Bound dev/xdclass-pvc1 20mxdclass-pv2 2Gi RWX Retain Available 20m
这是因为pvc2所申请的存储大小为3G,而pv2只能提供2G,因此无法进行绑定。
创建pod 挂载pvc
xxxxxxxxxxapiVersion: v1kind: Podmetadata:name: xdclass-pod1namespace: devspec:containers:- name: xdclass-busyboximage: busyboxcommand: ["/bin/sh","-c","while true;do echo hello xdclass pod1 >> /opt/print.txt; sleep 5; done;"]volumeMounts:- name: volumemountPath: /opt/volumes:- name: volumepersistentVolumeClaim:claimName: xdclass-pvc1readOnly: false---apiVersion: v1kind: Podmetadata:name: xdclass-pod2namespace: devspec:containers:- name: xdclass-busyboximage: busyboxcommand: ["/bin/sh","-c","while true;do echo hello xdclass pod2 >> /opt/print.txt; sleep 5; done;"]volumeMounts:- name: volumemountPath: /opt/volumes:- name: volumepersistentVolumeClaim:claimName: xdclass-pvc2readOnly: false
创建pod完成后,到nfs服务器查看 /opt/nfsdata/pv1/print.txt
xxxxxxxxxx[root@iZwz90pegu9budx5tk4ruyZ nfsdata]# tail -f pv1/print.txthello xdclass pod1hello xdclass pod1hello xdclass pod1hello xdclass pod1
愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介: Kubernetes部署SpringBoot架构讲解
需求

SpringBoot结构代码介绍

部署环境和流程

简介: Linux服务器配置Maven和Jdk构建环境实战
为啥要在Linux下安装Maven和JDK11
安装软件(都在本章本集资料包里面)
安装Docker(本身已经安装)
安装JDK11 配置全局环境变量
xxxxxxxxxxJAVA_HOME=/usr/local/software/jdk11CLASSPATH=$JAVA_HOME/lib/PATH=$PATH:$JAVA_HOME/binexport PATH JAVA_HOME CLASSPATH
环境变量立刻生效
问题
安装Maven
xxxxxxxxxxyum install unzip -y
xxxxxxxxxxvim /etc/profileJAVA_HOME=/usr/local/software/jdk/jdk11CLASSPATH=$JAVA_HOME/lib/PATH=$PATH:$JAVA_HOME/binMAVEN_HOME=/usr/local/software/maven3.5PATH=$PATH:$MAVEN_HOME/binexport PATH JAVA_HOME CLASSPATH MAVEN_HOME
环境变量立刻生效
简介: SpringBoot项目构建和打包Docker镜像实战
上传springboot代码
xxxxxxxxxxmvn clean install
xxxxxxxxxxdocker build -t xdclass-k8s:1.0 .
xxxxxxxxxxdocker images
xxxxxxxxxxdocker run -d -it -p 8080:8080 --name=k8sdemo xdclass-k8s:1.0
访问(网络安全组记得开放端口)
xxxxxxxxxxdocker logs -f 8e2349c574dbe1bb77c1c78fd714d54374a7f05ea5685ef2092625e341580e99docker stop 8e2349c574dbdocker rm 8e2349c574db
简介: 阿里云私有镜像仓库介绍和镜像推送实战
官方公共镜像仓库和私有镜像仓库
公共镜像仓库:
私有镜像仓库:
用于存放公司内部的镜像,不提供给外部试用;
有哪些?
开通阿里云私有镜像仓库
登录阿里云账号访问地址:
初次使用会提示开通
配置镜像仓库密码(不是阿里云密码)
推送私有镜像仓
xxxxxxxxxxdocker login --username=xdclass666 registry.cn-shenzhen.aliyuncs.com#打tagdocker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/xdclass-k8s/xdclass-demo:[镜像版本号]docker tag 0e0ce8186dbf registry.cn-shenzhen.aliyuncs.com/xdclass-k8s/xdclass-demo:1.0#推送docker push registry.cn-shenzhen.aliyuncs.com/xdclass-k8s/xdclass-demo:[镜像版本号]docker push registry.cn-shenzhen.aliyuncs.com/xdclass-k8s/xdclass-demo:1.0#拉取docker pull registry.cn-shenzhen.aliyuncs.com/xdclass-k8s/xdclass-demo:[镜像版本号]
简介: K8S部署SpringBoot项目实战《上》
K8S部署SpringBoot步骤
secret有多个类型
dockerconfigjson
Service Account
Opaque
步骤
xxxxxxxxxxkubectl create secret docker-registry xdclass-docker-secret --docker-server=registry.cn-shenzhen.aliyuncs.com --docker-username=用户名 --docker-password=登录密码kubectl create secret docker-registry xdclass-docker-secret --docker-server=registry.cn-shenzhen.aliyuncs.com --docker-username=xdclass666 --docker-password=xdclass.net168
xxxxxxxxxxkubectl create deployment k8sdemo --image=registry.cn-shenzhen.aliyuncs.com/xdclass-k8s/xdclass-demo:1.0 --dry-run=client -o yaml > xdclass-k8s.yaml[root@iZwz90pegu9budx5tk4ruzZ ~]# cat xdclass-k8s.yamlapiVersion: apps/v1kind: Deploymentmetadata:creationTimestamp: nulllabels:app: k8sdemoname: k8sdemospec:replicas: 1selector:matchLabels:app: k8sdemostrategy: {}template:metadata:creationTimestamp: nulllabels:app: k8sdemospec:containers:- image: registry.cn-shenzhen.aliyuncs.com/xdclass-k8s/xdclass-demo:1.0name: xdclass-k8sresources: {}status: {}
xxxxxxxxxx1)修改副本数量为 22)挂载 secretapiVersion: apps/v1kind: Deploymentmetadata:creationTimestamp: nulllabels:app: k8sdemoname: k8sdemospec:replicas: 2selector:matchLabels:app: k8sdemostrategy: {}template:metadata:creationTimestamp: nulllabels:app: k8sdemospec:imagePullSecrets:- name: xdclass-docker-secretcontainers:- image: registry.cn-shenzhen.aliyuncs.com/xdclass-k8s/xdclass-demo:1.0name: xdclass-k8sresources: {}status: {}
简介: K8S部署SpringBoot项目实战《下》
xxxxxxxxxxkubectl apply -f xdclass-k8s.yaml
xxxxxxxxxxkubectl expose deploy k8sdemo --port=8080 --target-port=8080 --type=NodePort
测试运行
xxxxxxxxxxcurl ip+port
xxxxxxxxxxkubectl get pod -o widekubectl exec -it k8sdemo -- /bin/sh
愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介: K8S集群可视化管理工具介绍
为了解决容器管理的问题,就有了容器编排管理工具
主流的容器编排工具
xxxxxxxxxx经过几年的竞争,K8S 击败 Swarm 和 Mesos,几乎成了当前容器编排的事实标准K8S 最初是由 Google 开发的,后来捐赠给了 CNCF(云原生计算基金会,隶属 Linux 基金会)
K8S 既然那么猛,直接拿来用不香吗?
xxxxxxxxxxPod、Service、Node、kubelet、kube-proxy、API Server、Scheduler、Labels、Deployment...
等你掌握一系列概念后且搭建过本地的k8s

什么是K8S 可视化管理工具
可视化工具介绍
kubernetes Dashboard
KubeSphere
Rancher
简介:容器编排管理平台Rancher介绍和概念讲解
什么是Rancher
是一个开源的企业级PaaS容器管理平台。通过Rancher,企业再也不必自己使用一系列的开源软件去从头搭建容器服务平台
Rancher提供了在生产环境中使用的管理Docker和Kubernetes的全栈化容器部署与管理平台
通信模型介绍
特性
基础设施编排
容器编排与调度
中文文档
简介:云服务器Docker容器化部署Rancher2.x实战
注意事项
基于Docker镜像安装Rancher,阿里云 Linux CentOS 7.8 + Docker-20.10.10
选择Rancher机器可以把【内存+带宽】弄大点,因为Rancher部署好后需要下载很多的镜像,不要因为内存问题导致部署没成功
安装Docker
xxxxxxxxxx# 1.先安装ymlyum install -y yum-utils device-mapper-persistent-data lvm2# 2.设置阿里云镜像sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo# 3.查看可安装的docker版本yum list docker-ce --showduplicates | sort -r#4. 安装dockeryum -y install docker-ce-20.10.10-3.el7#5. 查看docker版本docker -v#配置开机自启动systemctl enable docker.service#6. 启动dockersystemctl start docker#7. 查看docker 启动状态systemctl status docker
安装Rancher
创建Rancher挂载目录
xxxxxxxxxxmkdir -p /data/rancher_home/ranchermkdir -p /data/rancher_home/auditlog
部署Rancher
xxxxxxxxxxdocker run -d --privileged --restart=unless-stopped -p 80:80 -p 443:443 \-v /data/rancher_home/rancher:/var/lib/rancher \-v /data/rancher_home/auditlog:/var/log/auditlog \--name xdclass_rancher1 rancher/rancher:v2.5.7
登录Rancher
启动成功rancher后, 可以打开浏览器输入IP地址来进入Rancher
登录地址为:http://+IP ,如:http://47.106.69.xxx
配置账号密码,填写完账号密码后直接Continue即可。
保存配置

简介:Rancher2.X添加集群配置RancherAgent节点
基于K8S集群的Rancher可以加很多节点





添加Linux主机节点(主机节点安装启动好docker)
xxxxxxxxxx# 1.先安装ymlyum install -y yum-utils device-mapper-persistent-data lvm2# 2.设置阿里云镜像sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo# 3.查看可安装的docker版本yum list docker-ce --showduplicates | sort -r#4. 安装dockeryum -y install docker-ce-20.10.10-3.el7#5. 查看docker版本docker -v#配置开机自启动systemctl enable docker.service#6. 启动dockersystemctl start docker#7. 查看docker 启动状态systemctl status docker


简介:Rancher2.X配置私有镜像仓库实战

私有镜像仓库配置




愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介: Rancher部署SpringBoot私有镜像实战
部署之前K8S命令部署的应用
备注
新增工作负载


简介:Rancher2.X部署中间件-Mysql8.0
注意
常规互联网企业里面的中间件,运维工程师负责搭建
部分组件可以选择直接部署:容器、源码编译,并非一定要某个方式
同个Rancher命名空间下,ip可以使用【容器服务名称】进行替代
部署Mysql
业务微服务使用
配置
xxxxxxxxxx镜像:mysql:8.0环境变量:MYSQL_ROOT_PASSWORD=xdclass.net168路径映射/home/data/mysql/data/var/lib/mysql:rw/etc/localtime/etc/localtime:ro在创建 Docker 容器时,加上 “-v /etc/localtime:/etc/localtime:ro” 参数让容器使用宿主机的时间,容器时间与宿主机时间同步,:ro 指定该 volume 为只读



简介:Rancher2.X部署分布式缓存Redis7实战
注意
部署Redis
xxxxxxxxxx镜像:redis:7.0.2端口:6379:6379数据卷:/mydata/redis/data/data入口命令redis-server --requirepass xdclass.net

简介: Rancher里面kubectl命令解析和yaml备份
yaml文件备份
简介: 一线大厂标准化DevOpS架构-容器编排调度
软件生命周期
一个软件从零开始到最终交付
【小滴课堂】 为例子
前期(功能简单)
中期(增加需求)
后期(功能多、项目多、时间少)

什么是CICD
什么是DevOps
通俗易懂的话

愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介: 容器编排调度K8S最佳实践专题课程总结
K8S知识点回顾
Kubernetes核心资源管理操作实战
Kubernetes核心资源之名称空间和Pod实战
Kubernetes核心资源之Pod控制器实战
Kubernetes核心资源之Service服务实战
Kubernetes核心资源之数据存储持久化
云服务器K8S集群部署SpringBoot项目实战
容器编排调度-K8S可视化工具Rancher2.x实战
Rancher2.X部署多案例镜像实战

容器编排调度K8S课程总结和架构路线学习
简介: 微服务架构-海量数据项目-商用短链平台大课先导集《上》
简介: 微服务架构-海量数据项目-商用短链平台大课先导集《下》
简介:小滴课堂架构师学习路线和大课训练营介绍
技术培训的你应该知道的事情

为啥说免费的才是最贵的,比如【盗版视频】或者【割韭菜的机构】
视频录制时间旧 或者 讲师水平Low,导致学不到技术甚至还【学错了技术】
课程资料、代码缺少,导致自己花了大量时间去调试最后还不一定解决
项目源码不规范、思考维度缺少,什么样的老师带出什么样的学生
正版学习群的关键性
大家计算下自己的时薪、日薪
月薪20k, 一天8小时,一个月工作22天,你一小时值多少钱、一天值多少钱 ,1千块!!
还有很多互联网公司,一年14到16个月工资+股票,那一天就是好几千了,阿里P6级别都是30k月薪
举个跳槽例子
记住!!!!
跳槽涨薪不是你说跳就跳的,说涨就涨的
你需要有让面试官给你这个薪资的理由
小滴课堂永久会员 & 小滴课堂年度会员
适合IT人员,零基础就业、在职充电、架构师学习路线-专题技术方向
学后水平:一线城市 15~25k
适合人员:校招、应届生、培训机构出来、工作1~10年的同学都适合

大课综合训练营
适合用于专项拔高,适合有一定工作经验的同学,架构师方向发展的训练营,包括多个方向
综合项目大课训练营
海量数据分库分表大课训练营
架构解决方案大课训练营
全链路性能优化大课训练营
安全攻防大课训练营
数据分析大课训练营
算法刷题大课训练营
技术人的导航站(涵盖我们主流的技术网站、社区、工具等等,即将上线)
后端/前端 一对一小班辅导
适合人员
亮点:
远程解决bug+简历辅导+模拟面试,对标一线城市12~20K月薪
7*12小时在线答疑,问题不过夜
人员配置:课程讲师+专业技术人员
后端/前端 保涨薪就业班
小班制学习,培训时间:3~8个月
Level1:薪资目标(12-18k)
Level2:薪资目标(18-30k)
报名条件
学历:大专及大专以上
年龄:18-32周岁
工作经验:至少1年以上或者 校招是本科以上
就业城市:互联网一线及二线城市
满足基础要求提交简历和入学考试,根据成绩进行老师评估(负责人:二当家小D)
学习时间要求
