愿景:"让编程不再难学,让技术与生活更加有趣" 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.先安装yml
yum 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. 安装docker
yum -y install docker-ce-20.10.10-3.el7
#5. 查看docker版本
docker -v
#配置开机自启动
systemctl enable docker.service
#6. 启动docker
systemctl start docker
#7. 查看docker 启动状态
systemctl status docker
xxxxxxxxxx
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
xxxxxxxxxx
yum install -y kubectl-1.18.0
xxxxxxxxxx
curl -LO https://storage.googleapis.com/minikube/releases/v1.18.1/minikube-linux-amd64 && sudo install minikube-linux-amd64 /usr/local/bin/minikube
xxxxxxxxxx
minikube version
xxxxxxxxxx
minikube 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部署第一个应用
xxxxxxxxxx
kubectl cluster-info
xxxxxxxxxx
kubectl get node
xxxxxxxxxx
kubectl get pod -A
部署第一个K8S应用-Nginx,并通过公网ip访问
xxxxxxxxxx
kubectl create deployment xdclass-nginx --image=nginx:1.23.0
对比Docker部署
docker run --name xdclass-nginx -p 8080:80 -d nginx:1.23.0
xxxxxxxxxx
kubectl get deployment,pod,svc
xxxxxxxxxx
kubectl expose deployment xdclass-nginx --port=80 --type=NodePort
xxxxxxxxxx
kubectl port-forward --address 0.0.0.0 service/xdclass-nginx 80:80
解释:
kubectl port-forward 转发一个本地端口到 Pod 端口,不会返回数据,需要打开另一个终端来继续这个练习
注意
Minikube的搭建跟用Kubeadm的有一点不一样
简介:基于KubeAdm搭建多节点K8S集群
安装步骤
安装docker(主节点+工作节点)
xxxxxxxxxx
# 1.先安装yml
yum 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. 安装docker
yum -y install docker-ce-20.10.10-3.el7
#5. 查看docker版本
docker -v
#配置开机自启动
systemctl enable docker.service
#6. 启动docker
systemctl start docker
#7. 查看docker 启动状态
systemctl status docker
配置阿里云镜像源(主节点+工作节点)
xxxxxxxxxx
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
安装kubelet kubeadm kubectl(主节点+工作节点)
xxxxxxxxxx
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
主节点初始化(主节点)
xxxxxxxxxx
kubeadm 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软件版本)
说明:
当初始化完成之后执行命令,并加入工作节点
加入工作节点
查看节点
xxxxxxxxxx
kubectl get nodes
#状态都是NotReady,需要配置网络插件
安装网络插件
xxxxxxxxxx
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
xxxxxxxxxx
kubectl apply -f flannel.yaml
#flannel.yaml 文件内容
---
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: psp.flannel.unprivileged
annotations:
seccomp.security.alpha.kubernetes.io/allowedProfileNames: docker/default
seccomp.security.alpha.kubernetes.io/defaultProfileName: docker/default
apparmor.security.beta.kubernetes.io/allowedProfileNames: runtime/default
apparmor.security.beta.kubernetes.io/defaultProfileName: runtime/default
spec:
privileged: false
volumes:
- configMap
- secret
- emptyDir
- hostPath
allowedHostPaths:
- pathPrefix: "/etc/cni/net.d"
- pathPrefix: "/etc/kube-flannel"
- pathPrefix: "/run/flannel"
readOnlyRootFilesystem: false
# Users and groups
runAsUser:
rule: RunAsAny
supplementalGroups:
rule: RunAsAny
fsGroup:
rule: RunAsAny
# Privilege Escalation
allowPrivilegeEscalation: false
defaultAllowPrivilegeEscalation: false
# Capabilities
allowedCapabilities: ['NET_ADMIN']
defaultAddCapabilities: []
requiredDropCapabilities: []
# Host namespaces
hostPID: false
hostIPC: false
hostNetwork: true
hostPorts:
- min: 0
max: 65535
# SELinux
seLinux:
# SELinux is unsed in CaaSP
rule: 'RunAsAny'
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: flannel
rules:
- apiGroups: ['extensions']
resources: ['podsecuritypolicies']
verbs: ['use']
resourceNames: ['psp.flannel.unprivileged']
- apiGroups:
- ""
resources:
- pods
verbs:
- get
- apiGroups:
- ""
resources:
- nodes
verbs:
- list
- watch
- apiGroups:
- ""
resources:
- nodes/status
verbs:
- patch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: flannel
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: flannel
subjects:
- kind: ServiceAccount
name: flannel
namespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: flannel
namespace: kube-system
---
kind: ConfigMap
apiVersion: v1
metadata:
name: kube-flannel-cfg
namespace: kube-system
labels:
tier: node
app: flannel
data:
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/v1
kind: DaemonSet
metadata:
name: kube-flannel-ds-amd64
namespace: kube-system
labels:
tier: node
app: flannel
spec:
selector:
matchLabels:
app: flannel
template:
metadata:
labels:
tier: node
app: flannel
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: beta.kubernetes.io/os
operator: In
values:
- linux
- key: beta.kubernetes.io/arch
operator: In
values:
- amd64
hostNetwork: true
tolerations:
- operator: Exists
effect: NoSchedule
serviceAccountName: flannel
initContainers:
- name: install-cni
image: lizhenliang/flannel:v0.11.0-amd64
command:
- cp
args:
- -f
- /etc/kube-flannel/cni-conf.json
- /etc/cni/net.d/10-flannel.conflist
volumeMounts:
- name: cni
mountPath: /etc/cni/net.d
- name: flannel-cfg
mountPath: /etc/kube-flannel/
containers:
- name: kube-flannel
image: lizhenliang/flannel:v0.11.0-amd64
command:
- /opt/bin/flanneld
args:
- --ip-masq
- --kube-subnet-mgr
resources:
requests:
cpu: "100m"
memory: "50Mi"
limits:
cpu: "100m"
memory: "50Mi"
securityContext:
privileged: false
capabilities:
add: ["NET_ADMIN"]
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
volumeMounts:
- name: run
mountPath: /run/flannel
- name: flannel-cfg
mountPath: /etc/kube-flannel/
volumes:
- name: run
hostPath:
path: /run/flannel
- name: cni
hostPath:
path: /etc/cni/net.d
- name: flannel-cfg
configMap:
name: kube-flannel-cfg
查看节点状态
xxxxxxxxxx
kubectl get node
查看系统pod状态
xxxxxxxxxx
kubectl get pods -n kube-system
简介: 带你5分钟基于K8S集群部署你的第一个K8S应用
xxxxxxxxxx
kubectl cluster-info
xxxxxxxxxx
kubectl get node
xxxxxxxxxx
kubectl get pod -A
部署第一个K8S应用-Nginx,并通过公网ip访问
xxxxxxxxxx
kubectl create deployment xdclass-nginx --image=nginx:1.23.0
xxxxxxxxxx
kubectl get deployment,pod,svc
xxxxxxxxxx
kubectl expose deployment xdclass-nginx --port=80 --type=NodePort
xxxxxxxxxx
kubectl get pod,svc
在浏览器访问, 工作节点开放端口31512,访问工作节点ip:31512(网络安全组记得开放31512端口)
注意
愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介:Kubernetes常见资源管理命令介绍
概念
使用kubectl来管理资源
kubectl用法:
xxxxxxxxxx
kubectl [command] [TYPE] [NAME] [flags]
例子
xxxxxxxxxx
#获取全部节点
kubectl get node
#获取全部pod
kubectl 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会被删除
资源管理方式:
命令式对象管理:直接使用命令去操作资源
xxxxxxxxxx
kubectl run 资源名称 --image=镜像名称 --port=端口号
例子:
kubectl run xdclass-nignx-pod --image=nginx:1.23.0 --port=80
kubectl create deployment xdclass-nginx --image=nginx:1.23.0
命令式对象配置:通过命令配置和配置文件去操作资源
xxxxxxxxxx
kubectl create -f 配置文件名称.yaml
声明式对象配置:通过apply和配置文件操作资源
xxxxxxxxxx
kubectl apply -f 配置文件名称.yaml
yaml例子
xxxxxxxxxx
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.23.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
xxxxxxxxxx
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- image: nginx:1.23.0
name: pod
ports:
- name: nginx-port
containerPort: 80
protocol: 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.yaml
cat nginx.yaml
精简版 yaml
xxxxxxxxxx
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: xdclass-nginx
name: xdclass-nginx
spec:
replicas: 1
selector:
matchLabels:
app: xdclass-nginx
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: xdclass-nginx
spec:
containers:
- image: nginx:1.23.0
name: nginx
resources: {}
status: {}
pod的yaml文件示例
yaml文件示例:
xxxxxxxxxx
# pod的最基础的yaml文件最少需要以下的几个参数
apiVersion: v1 # API版本号,注意:具有多个,不同的对象可能会使用不同API
kind: Pod # 对象类型,pod
metadata: # 元数据
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
查看所有命令空间
xxxxxxxxxx
kubectl 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.yaml
apiVersion: v1
kind: Namespace
metadata:
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方式运行的
xxxxxxxxxx
kubectl 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.yaml
spec:
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资源限制
说明:
xxxxxxxxxx
resources:
requests:
memory:"内存大小"
cpu:"cpu占用大小"
limits:
memory:"内存占用大小"
cpu:"cpu占用大小"
——————————————————————————————————————————————
CPU 资源以 CPU 单位度量。Kubernetes 中的一个 CPU 等同于:
1 个 AWS vCPU
1 个 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)
xxxxxxxxxx
nodeSelector:
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-labels
kubectl 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-
xxxxxxxxxx
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: xdclass-nginx
name: xdclass-nginx
namespace: dev
spec:
replicas: 2
selector:
matchLabels:
app: xdclass-nginx
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: xdclass-nginx
spec:
containers:
- image: nginx:1.23.0
name: nginx
resources: {}
status: {}
简介:Kubernetes的NodeSelector标签选择器实战
nodeSelector
xxxxxxxxxx
# 查看node节点标签
kubectl get node --show-labels
配置文件
xxxxxxxxxx
apiVersion: v1
kind: Pod
metadata:
name: xdclass-nginx
spec:
containers:
- name: nginx
image: nginx:1.23.0
imagePullPolicy: IfNotPresent
nodeSelector:
env: test
xxxxxxxxxx
#创建pod
kubectl 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=test
kubectl 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模板介绍
xxxxxxxxxx
apiVersion: 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-pod
template: # pod模板,当数量不满足的时候,根据下面编码创建pod副本
metadata: # 元对象信息
labels: # pod资源标签
app: xdclass-nginx-pod
spec: #具体详情
containers: # 容器数组列表
- name: xdclass-nginx #容器名称
image: nginx:1.23.0 # 镜像和版本
xxxxxxxxxx
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: xdclass-rs
namespace: dev
spec:
replicas: 5
selector:
matchLabels:
app: xdclass-nginx-pod
template:
metadata:
labels:
app: xdclass-nginx-pod
spec:
containers:
- name: xdclass-nginx
image: 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
xxxxxxxxxx
apiVersion: apps/v1
kind: Deployment
metadata:
name: xdclass-deploy
namespace: dev
spec:
replicas: 5
selector:
matchLabels:
app: xdclass-nginx-pod
template:
metadata:
labels:
app: xdclass-nginx-pod
spec:
containers:
- name: xdclass-nginx
image: nginx:1.23.0
xxxxxxxxxx
#创建
kubectl apply -f deploy-nginx-pod.yaml
# 查看deployment
kubectl 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更新有两种方式
xxxxxxxxxx
spec:
strategy: # 策略
type: RollingUpdate
Recreate : 删除全部旧的pod,然后创建新的pod
RollingUpdate:滚动升级更新,删除部分,更新部分,在整个更新过程中,存在两个版本的pod
xxxxxxxxxx
升级过程中不可用Pod的最大数量,默认为25%
在滚动更新时,我们可以忍受多少个 Pod 无法提供服务
值越小越能保证服务稳定,更新越平滑
xxxxxxxxxx
升级过程中可以超过期望的Pod的最大数量,默认为25%;
在滚动更新时,可以有多少个额外的 Pod
值调的越大,副本更新速度越快
例子 deploy-rollout.yaml
xxxxxxxxxx
MaxUnavailable为0, 在新 Pod 启动并就绪之前,不要关闭任何旧Pod
MaxSurge 为100%, 立即启动所有新 Pod,也就是有足够的资源希望尽快完成更新。
默认两个值都是 25%
如果更新一个 100 Pod 的 Deployment,会立刻创建 25 个新 Old,同时会关闭 25 个旧 Pod;
每次有 Pod 启动就绪,就可以关闭旧 Pod
xxxxxxxxxx
apiVersion: apps/v1
kind: Deployment
metadata:
name: xdclass-deploy
namespace: dev
spec:
replicas: 5
revisionHistoryLimit: 5 #保留历史版本5个
strategy:
type: RollingUpdate
selector:
matchLabels:
app: xdclass-nginx-pod
template:
metadata:
labels:
app: xdclass-nginx-pod
spec:
containers:
- name: xdclass-nginx
image: nginx:1.23.0
查看控制器参数
xxxxxxxxxx
kubectl describe deploy xdclass-deploy -n dev
滚动升级
xxxxxxxxxx
kubectl 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=true
kubectl set image deployment/xdclass-deploy xdclass-nginx=nginx:1.23.0 -n dev --record=true
xxxxxxxxxx
kubectl get pods -n dev -w
发布回滚
kubectl rollout 版本升级相关介绍
查看历史版本列表
xxxxxxxxxx
kubectl rollout history deployment/xdclass-deploy -n dev
xxxxxxxxxx
kubectl rollout history deployment/xdclass-deploy -n dev --revision=2
xxxxxxxxxx
kubectl rollout undo deployment/xdclass-deploy -n dev
xxxxxxxxxx
kubectl rollout status deployment/xdclass-deploy -n dev
xxxxxxxxxx
kubectl rollout undo deployment/xdclass-deploy -n dev --to-revision=2
删除deployment
xxxxxxxxxx
kubectl delete -f deploy-nginx-pod.yaml
简介:K8S核心控制器之DaemonSet控制器实战
DaemonSet(节点级别的pod)
案例 daemonset-nginx.yaml
xxxxxxxxxx
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: xdclass-ds
namespace: dev
spec:
selector:
matchLabels:
app: xdclass-nginx-pod
template:
metadata:
labels:
app: xdclass-nginx-pod
spec:
containers:
- name: xdclass-nginx
image: nginx:1.23.0
imagePullPolicy: IfNotPresent
命令验证
xxxxxxxxxx
#创建
kubectl apply -f daemonset-nginx.yaml
#只有一个节点,多个节点的话,每个节点都有一个pod
kubectl get pod,deploy,rs,ds -n dev
简介:K8S核心控制器之Job控制器实战
Job控制器
参数讲解
xxxxxxxxxx
apiVersion: batch/v1
kind: Job
metadata:
name: xdclass-job
namespace: dev
spec:
parallelism: 2 #job并发运行Pods的数量,默认 1
completions: 3 #job需要成功运行Pods的次数,默认 1
backoffLimit: 5 #job失败后进行重试的次数,默认是6
activeDeadlineSeconds: 100 #job运行超时时间,当job超过timeout时间,则job的状态也会更新为failed
template:
spec:
restartPolicy: Never #job重启策略,OnFailure或Never
containers:
- name: demo
image: busybox:1.35.0
# 容器的启动命令列表,在pod中的容器初始化完毕后运行命令
command: ["echo","hello xdclass.net k8s job"]
BusyBox
案例实战
xxxxxxxxxx
apiVersion: batch/v1
kind: Job
metadata:
name: xdclass-job
spec:
parallelism: 2
completions: 3
backoffLimit: 5
activeDeadlineSeconds: 100
template:
spec:
restartPolicy: Never
containers:
- name: demo
image: busybox:1.35.0
command: ["echo","hello xdclass.net k8s job"]
xxxxxxxxxx
kubectl get job -n dev -o wide
kubectl 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的关系
xxxxxxxxxx
spec: # 描述
selector: # 标签选择器,确定当前service代理控制哪些pod
app: xdclass-nginx
yaml模板文件
xxxxxxxxxx
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
name: xdclass-svc
spec:
ports:
- port: 80 # service服务端口
protocol: TCP
targetPort: 80 # pod端口,常规和容器内部端口一致
selector:
app: xdclass-nginx-pod
status:
loadBalancer: {}
简介:K8S里面的port-targetPort -nodePort-containerPort 你知道怎么区分不
关于K8S中端口的概念区分
port
nodePort
targetPort
containerPort
总结
xxxxxxxxxx
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: dev
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.20
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80 #容器端口
---
apiVersion: apps/v1
kind: Service
metadata:
name: nginx
spec:
type: NodePort # 有配置NodePort,外部可访问k8s中的服务 ,
ports:
- name: nginx
port: 80 # 服务service的访问端口
protocol: TCP
targetPort: 80 # pod端口,映射到容器端口
nodePort: 30015 # NodePort,通过nodeport类型的service暴露给集群外部访问
selector:
app: nginx
简介:K8S服务Service的ClusterIP实战
xxxxxxxxxx
kubectl apply -f deploy-nginx-pod.yaml
xxxxxxxxxx
kubectl get deployment,pod,svc -n dev -o wide
xxxxxxxxxx
kubectl expose deploy xdclass-deploy --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n dev
xxxxxxxxxx
kubectl get deployment,pod,svc -n dev -o wide
xxxxxxxxxx
kubectl describe svc svc-nginx1 -n dev
简介:K8S服务Service的NodePort和EndPoint实战
NodePort
xxxxxxxxxx
kubectl 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,可以修改指定范围
xxxxxxxxxx
kubectl describe svc svc-nodeport-nginx1 -n dev
Endpoint(缩写是ep)
xxxxxxxxxx
kubectl get ep svc-nodeport-nginx1 -n dev -o wide
大家的疑惑点,service如何决定分发请求到后端的Pod?
kubernetes提供了两种负载均衡策略
验证
xxxxxxxxxx
#查看全部pod和ip
kubectl get pods -n dev -o wide
#修改pod里面容器nginx的默认静态页面,内容为Pod所在的ip
kubectl exec -it xdclass-deploy-64967f6b67-p66wh -n dev /bin/sh
echo "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里面定义两个容器,一个产生日志,一个是读日志输出到控制台
xxxxxxxxxx
apiVersion: v1
kind: Pod
metadata:
name: xdclass-volume-emptydir
namespace: dev
spec:
containers:
- name: xdclass-nginx
image: nginx:1.20
ports:
- containerPort: 80
volumeMounts: # 将nginx-log-volume挂在到nginx容器中,对应的目录为 /var/log/nginx
- name: nginx-log-volume
mountPath: /var/log/nginx
- name: xdclass-busybox
image: busybox:1.35.0
command: ["/bin/sh","-c","tail -f /usr/local/test/access.log"] # 容器启动后初始命令,读取指定文件中内容
volumeMounts: # 将nginx-log-volume挂在到busybox容器中,对应的目录为 /logs
- name: nginx-log-volume
mountPath: /usr/local/test
volumes: # 这里声明volume存储劵, name为nginx-log-volume,类型是emptyDir
- name: nginx-log-volume
emptyDir: {}
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
xxxxxxxxxx
kubectl delete -f volume-emptydir.yaml
简介: K8S数据存储Volume之hostPath实战
HostPath
emptyDir中数据没做持久化,随着Pod的结束而销毁,需要持久化到磁盘则选其他方式
hostPath类型的磁盘就是挂在了主机的一个文件或者目录
案例
HostPath有多种类型,列举常见几个
案例 volume-hostpath.yaml
xxxxxxxxxx
apiVersion: v1
kind: Pod
metadata:
name: xdclass-volume-hostpath
namespace: dev
spec:
containers:
- name: xdclass-nginx
image: nginx:1.20
ports:
- containerPort: 80
volumeMounts: # 将nginx-log-volume挂在到nginx容器中,对应的目录为 /var/log/nginx
- name: nginx-log-volume
mountPath: /var/log/nginx
- name: xdclass-busybox
image: busybox:1.35.0
command: ["/bin/sh","-c","tail -f /usr/local/test/access.log"] # 容器启动后初始命令,读取指定文件中内容
volumeMounts: # 将nginx-log-volume挂在到busybox容器中,对应的目录为 /logs
- name: nginx-log-volume
mountPath: /usr/local/test
volumes: # 这里声明volume存储劵, name为nginx-log-volume,类型是hostPath
- name: nginx-log-volume
hostPath:
path: /usr/local/test
type: 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
xxxxxxxxxx
kubectl delete -f volume-hostpath.yaml
emptyDir和hostPath对比
简介: K8S数据存储ConfigMap实战
需求
ConfigMap介绍(缩写cm)
使用方式
xxxxxxxxxx
格式如下
kubectl create configmap NAME --from-literal=key1=value1 --from-literal=key2=value2
实操
xxxxxxxxxx
kubectl create configmap xdclass-config --from-literal=account=xdclass --from-literal=password=123456
#查看
[root@iZwz90pegu9budx5tk4ruzZ ~]# kubectl get cm xdclass-config -o yaml
apiVersion: v1
data:
account: xdclass
password: password
kind: ConfigMap
metadata:
creationTimestamp: "2022-07-04T06:36:18Z"
name: xdclass-config
namespace: default
resourceVersion: "1716676"
selfLink: /api/v1/namespaces/default/configmaps/xdclass-config
uid: 6ae2890e-fad3-452c-9179-78dd63ddbbba
xxxxxxxxxx
apiVersion: v1
kind: ConfigMap
metadata:
name: xdclass-configmap
namespace: dev
data:
info:
username:xdclass
password:123456
xxxxxxxxxx
#创建
kubectl create -f configmap.yaml
# 查看configmap详情
kubectl describe cm xdclass-configmap -n dev
xxxxxxxxxx
apiVersion: v1
kind: Pod
metadata:
name: pod-configmap
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.20
volumeMounts: # configmap挂载的目录
- name: config
mountPath: /config
volumes: # 声明configmap
- name: config
configMap:
name: xdclass-configmap
xxxxxxxxxx
#创建pod
kubectl create -f pod-configmap.yaml
#查看
kubectl get pod pod-configmap -n dev
#进入容器
kubectl exec -it pod-configmap -n dev -- /bin/sh
# cd /config
# cat info
username:xdclass
password: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/serviceaccount
cd /run/secrets/kubernetes.io/serviceaccount
cat ca.crt
Opaque
xxxxxxxxxx
echo -n 'admin' | base64 #账号
echo -n '123456' | base64 #密码
#创建secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
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.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-secret
spec:
containers:
- name: nginx
image: nginx:1.20
volumeMounts: # secret挂载
- name: xdclass-config
mountPath: /etc/secret
volumes:
- name: xdclass-config
secret:
secretName: mysecret
#创建pod
kubectl 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
#删除secret
kubectl 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 (对应要用到的节点都需要安装,但是不需要启动)
xxxxxxxxxx
yum install nfs-utils -y
创建目录(nfs服务器)
xxxxxxxxxx
#目录可以自定义
mkdir /opt/nfsdata
#给路径授权
chmod 777 /opt/nfsdata
编辑/etc/exports 配置文件(nfs服务器)
xxxxxxxxxx
vim /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服务
xxxxxxxxxx
systemctl start rpcbind
systemctl start nfs
验证
简介: K8S数据存储之NF持久卷挂载实战
xxxxxxxxxx
apiVersion: v1
kind: Pod
metadata:
name: xdclass-nfs
namespace: dev
labels:
apps: nginx-nfs
spec:
containers:
- name: nginx
image: nginx:1.20
ports:
- containerPort: 80
volumeMounts:
- name: logs-volume
mountPath: /var/log/nginx
volumes:
- name: logs-volume
nfs:
server: 172.31.101.8 #nfs服务器地址
path: /opt/nfsdata #共享文件路径
暴露服务
xxxxxxxxxx
kubectl expose pod xdclass-nfs -n dev --port=80 --target-port=80 --type=NodePort
查看nfs服务器的/opt/nfsdata
xxxxxxxxxx
[root@iZwz90pegu9budx5tk4ruyZ nfsdata]# ls
access.log error.log
访问nginx服务并查看nfs日志
xxxxxxxxxx
tail -f access.log
172.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模板
xxxxxxxxxx
apiVersion: v1
kind: PersistentVolume
metadata:
name: xdclass-pv
spec:
capacity:
storage: 5Gi #存储大小
accessModes:#访问模式
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle #回收策略
storageClassName: slow #存储类别
nfs:#卷插件
path: /tmp
server: 172.31.101.8
存储大小:存储大小是可以设置和请求的唯一资源。 未来可能会包含 IOPS、吞吐量等属性
访问模式:用户对资源的访问权限
存储类别:
回收策略(当PV不再被使用了之后的处理策略)
状态( PV 的生命周期有4种不同状态)
PVC的yaml模板
xxxxxxxxxx
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: xdclass-pvc
namespace: dev
spec:
accessModes: # 访问模式
- ReadWriteMany
selector: # 采用label标签对PV选择过滤
storageClassName: # 存储类别,设置对应的class的PV才能被系统选出
resources: # 需要存储资源的请求
requests:
storage: 3Gi
简介: K8S高级存储之NFS+PV和PVC案例实战
需求
PV和PVC的使用
搭建nfs环境(nfs服务器,基于上面的nfs):
创建目录
xxxxxxxxxx
mkdir /opt/nfsdata/pv1
mkdir /opt/nfsdata/pv2
chmod 777 /opt/nfsdata/pv1
chmod 777 /opt/nfsdata/pv2
修改配置文件
xxxxxxxxxx
vim /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
xxxxxxxxxx
systemctl restart nfs
创建两个PV
xxxxxxxxxx
apiVersion: v1
kind: PersistentVolume
metadata:
name: xdclass-pv1
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
server: 172.31.101.8
path: /opt/nfsdata/pv1
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: xdclass-pv2
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
server: 172.31.101.8
path: /opt/nfsdata/pv2
查看PV
xxxxxxxxxx
[root@iZwz99o60h8sytbhpurjc3Z ~]# kubectl get pv -o wide
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE VOLUMEMODE
xdclass-pv1 1Gi RWX Retain Available 25s Filesystem
xdclass-pv2 2Gi RWX Retain Available 25s Filesystem
创建PVC,使用pvc.yaml (与PV不同,PVC不属于集群资源,拥有自己的名称空间)
xxxxxxxxxx
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: xdclass-pvc1
namespace: dev
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: xdclass-pvc2
namespace: dev
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 3Gi
查看pvc
xxxxxxxxxx
[root@iZwz99o60h8sytbhpurjc3Z ~]# kubectl apply -f pvc.yaml
persistentvolumeclaim/xdclass-pvc1 created
persistentvolumeclaim/xdclass-pvc2 created
[root@iZwz99o60h8sytbhpurjc3Z ~]# kubectl get pvc -n dev
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
xdclass-pvc1 Bound xdclass-pv1 1Gi RWX 6s
xdclass-pvc2 Pending 6s
可以发现目前xdclass-pvc1已经与xdclass-pv1绑定了,而xdclass-pvc2却没有绑定
查看pv
xxxxxxxxxx
[root@iZwz99o60h8sytbhpurjc3Z ~]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
xdclass-pv1 1Gi RWX Retain Bound dev/xdclass-pvc1 20m
xdclass-pv2 2Gi RWX Retain Available 20m
这是因为pvc2所申请的存储大小为3G,而pv2只能提供2G,因此无法进行绑定。
创建pod 挂载pvc
xxxxxxxxxx
apiVersion: v1
kind: Pod
metadata:
name: xdclass-pod1
namespace: dev
spec:
containers:
- name: xdclass-busybox
image: busybox
command: ["/bin/sh","-c","while true;do echo hello xdclass pod1 >> /opt/print.txt; sleep 5; done;"]
volumeMounts:
- name: volume
mountPath: /opt/
volumes:
- name: volume
persistentVolumeClaim:
claimName: xdclass-pvc1
readOnly: false
---
apiVersion: v1
kind: Pod
metadata:
name: xdclass-pod2
namespace: dev
spec:
containers:
- name: xdclass-busybox
image: busybox
command: ["/bin/sh","-c","while true;do echo hello xdclass pod2 >> /opt/print.txt; sleep 5; done;"]
volumeMounts:
- name: volume
mountPath: /opt/
volumes:
- name: volume
persistentVolumeClaim:
claimName: xdclass-pvc2
readOnly: false
创建pod完成后,到nfs服务器查看 /opt/nfsdata/pv1/print.txt
xxxxxxxxxx
[root@iZwz90pegu9budx5tk4ruyZ nfsdata]# tail -f pv1/print.txt
hello xdclass pod1
hello xdclass pod1
hello xdclass pod1
hello xdclass pod1
愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介: Kubernetes部署SpringBoot架构讲解
需求
SpringBoot结构代码介绍
部署环境和流程
简介: Linux服务器配置Maven和Jdk构建环境实战
为啥要在Linux下安装Maven和JDK11
安装软件(都在本章本集资料包里面)
安装Docker(本身已经安装)
安装JDK11 配置全局环境变量
xxxxxxxxxx
JAVA_HOME=/usr/local/software/jdk11
CLASSPATH=$JAVA_HOME/lib/
PATH=$PATH:$JAVA_HOME/bin
export PATH JAVA_HOME CLASSPATH
环境变量立刻生效
问题
安装Maven
xxxxxxxxxx
yum install unzip -y
xxxxxxxxxx
vim /etc/profile
JAVA_HOME=/usr/local/software/jdk/jdk11
CLASSPATH=$JAVA_HOME/lib/
PATH=$PATH:$JAVA_HOME/bin
MAVEN_HOME=/usr/local/software/maven3.5
PATH=$PATH:$MAVEN_HOME/bin
export PATH JAVA_HOME CLASSPATH MAVEN_HOME
环境变量立刻生效
简介: SpringBoot项目构建和打包Docker镜像实战
上传springboot代码
xxxxxxxxxx
mvn clean install
xxxxxxxxxx
docker build -t xdclass-k8s:1.0 .
xxxxxxxxxx
docker images
xxxxxxxxxx
docker run -d -it -p 8080:8080 --name=k8sdemo xdclass-k8s:1.0
访问(网络安全组记得开放端口)
xxxxxxxxxx
docker logs -f 8e2349c574dbe1bb77c1c78fd714d54374a7f05ea5685ef2092625e341580e99
docker stop 8e2349c574db
docker rm 8e2349c574db
简介: 阿里云私有镜像仓库介绍和镜像推送实战
官方公共镜像仓库和私有镜像仓库
公共镜像仓库:
私有镜像仓库:
用于存放公司内部的镜像,不提供给外部试用;
有哪些?
开通阿里云私有镜像仓库
登录阿里云账号访问地址:
初次使用会提示开通
配置镜像仓库密码(不是阿里云密码)
推送私有镜像仓
xxxxxxxxxx
docker login --username=xdclass666 registry.cn-shenzhen.aliyuncs.com
#打tag
docker 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
步骤
xxxxxxxxxx
kubectl 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
xxxxxxxxxx
kubectl 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.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: k8sdemo
name: k8sdemo
spec:
replicas: 1
selector:
matchLabels:
app: k8sdemo
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: k8sdemo
spec:
containers:
- image: registry.cn-shenzhen.aliyuncs.com/xdclass-k8s/xdclass-demo:1.0
name: xdclass-k8s
resources: {}
status: {}
xxxxxxxxxx
1)修改副本数量为 2
2)挂载 secret
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: k8sdemo
name: k8sdemo
spec:
replicas: 2
selector:
matchLabels:
app: k8sdemo
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: k8sdemo
spec:
imagePullSecrets:
- name: xdclass-docker-secret
containers:
- image: registry.cn-shenzhen.aliyuncs.com/xdclass-k8s/xdclass-demo:1.0
name: xdclass-k8s
resources: {}
status: {}
简介: K8S部署SpringBoot项目实战《下》
xxxxxxxxxx
kubectl apply -f xdclass-k8s.yaml
xxxxxxxxxx
kubectl expose deploy k8sdemo --port=8080 --target-port=8080 --type=NodePort
测试运行
xxxxxxxxxx
curl ip+port
xxxxxxxxxx
kubectl get pod -o wide
kubectl exec -it k8sdemo -- /bin/sh
愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介: K8S集群可视化管理工具介绍
为了解决容器管理的问题,就有了容器编排管理工具
主流的容器编排工具
xxxxxxxxxx
经过几年的竞争,K8S 击败 Swarm 和 Mesos,几乎成了当前容器编排的事实标准
K8S 最初是由 Google 开发的,后来捐赠给了 CNCF(云原生计算基金会,隶属 Linux 基金会)
K8S 既然那么猛,直接拿来用不香吗?
xxxxxxxxxx
Pod、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.先安装yml
yum 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. 安装docker
yum -y install docker-ce-20.10.10-3.el7
#5. 查看docker版本
docker -v
#配置开机自启动
systemctl enable docker.service
#6. 启动docker
systemctl start docker
#7. 查看docker 启动状态
systemctl status docker
安装Rancher
创建Rancher挂载目录
xxxxxxxxxx
mkdir -p /data/rancher_home/rancher
mkdir -p /data/rancher_home/auditlog
部署Rancher
xxxxxxxxxx
docker 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.先安装yml
yum 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. 安装docker
yum -y install docker-ce-20.10.10-3.el7
#5. 查看docker版本
docker -v
#配置开机自启动
systemctl enable docker.service
#6. 启动docker
systemctl 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)
学习时间要求