CKA-Kubernets(K8s) (一)
# 跨主机通讯网络
BGP
vxlan
...
相关软件:calico flannel ...
容器的编排工具
compose,swarm,mesos(推特),kubernets,openshift(redhat)
k8s 理解是一个壳,它并不直接管理容器,调用runtime--docker
k8s pod (又称为worker): 容器的包装(k8s最小单元)
容器本身的功能比较单一,通过pod的各种策略,来管理容器
# 对比虚拟化VC 环境框架
# k8s 架构
# k8s 架构
master - 控制台
kubectl
REST API-server : 接受用户各种请求
scheduler : 调度器(选择创建pod创建位置)
controiller-manager: 管家(检测k8s,运行情况)
etcd: 数据库(所有操作存放的位置,不属于master下面的组件,可以独立安装单独服务器)
svc--ip: 负载均衡器(外接用户发送请求到SVC,SVC转发到pod)
kubeproxy:负债均衡器通过这个转发到后端pod
kubelet:相当于代理(agent)维护和接受master指令
CKA-Kubernets(K8s) 安装
# 安装K8s环境--试验拓扑图
OS:CentOS Linux release 7.7.1908 (Core)
Master:192.168.24.216/22 vm1.loki.com vm1
Worker1:192.168.27.217/22 vm2.loki.com vm2
worker2:192.168.27.218/22 vm3.loki.com vm3
前期准备工作
setterm -blank 0 # 关闭字符界面屏保
sudo yum install ntpdate -y;sudo ntpdate cn.pool.ntp.org # 确保服务器时间正常,进行一次同步
# 如果时区都不对,如下修改回来,确保时间正确
sudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 禁用swap
swapoff -a
为了防止开机启动那个,还需要注释掉 /etc/fstab里面的swap 或者命令删除swap这行内容
如果不关闭swap,就会在kubeadm初始化Kubernetes的时候报错
设置成功后,Swap显示为0
# 修改节点计算机名
sudo hostnamectl set-hostname <短名字>
# 修改防火墙策略(仅测试环境,实际工作环境根据自己情况)
sudo firewall-cmd --set-default-zone=trusted
# 检查selinux
# host文件修改,并同步到其他节点 /etc/hosts
# 配置yum源(视自己情况去阿里云或者网易源索取)
# 安装docker-ce(所有节点)
sudo yum install docker-ce -y
# 所有节点都启动docker,并设置为开机启动
sudo systemctl enable docker --now
这里可以使用docker info 和docker version 查看启动后的docker版本及其他信息
# 修改内核参数(所有节点)
sudo sh -c " cat <<EOF > /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF "
# 让修改的文件生效(所有节点)
sudo sysctl -p /etc/sysctl.d/k8s.conf
# 设置docker镜像加速器(所有节点,找自己的设置)
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://1vs5nfat.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload && sudo systemctl restart docker
## Kubernets 注意版本(所有节点安装)
sudo yum install -y kubelet-1.20.1-0 kubeadm-1.20.1-0 kubectl-1.20.1-0 --disableexcludes=kubernetes
# --disable 的意思 去除其他源(多个源)相冲突的包
# 启动服务并确认状态
sudo systemctl start kubelet && sudo systemctl enable kubelet && sudo systemctl is-active kubelet
# 源码包安装(自行研究)
Master
# Master节点操作 初始化集群(使用kubeadm 会生成很多容器,容器的镜像来自国外,所以需要指定yum源)
sudo kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.20.1 --pod-network-cidr=10.244.0.0/16
--image-repository 指定使用的镜像源(国内原因)
--pod-network-cidr=x.x.x.x/xx 指定一个内部的网段
# 安装成功后提示如下:
# 根据它的要求在当前master上执行:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 并提示如果有worker要加入你的集群,使用root身份执行下面的命令
kubeadm join 192.168.27.216:6443 --token <token_value> --discovery-token-ca-cert-hash <sha256_value>
可选参数:--ignore-preflight-errors=Swap
kubeadm token
如果忘记或者弄丢了join这串东西,可以使用kubeadm token 命令来创建和管理
# 查看token是否还可用 sudo kubeadm token list
# 还在则获取ca证书sha256编码hash值
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
# 创建token kubeadm token create --print-join-command //默认有效期24小时,若想久一些可以结合--ttl参数,设为0则用不过期
PS: 如果是非root用户执行,不加sudo会出现下面的错误
# 使用sudo后命令正常
# 删除某个token sudo kubeadm token delete <TokenID>
Worker
# 让所有worker 节点加入
注:如果忘记关闭swapoff -a ,加入的时候就会有如下提示;(记得同步/etc/fstab一同注释掉)
# 成功加入,如下提示
# 验证(在master上操作) kubectl get nodes
kubectl get nodes -o wide (查看更详细的节点信息,可以看到runtime)
# 验证(在worker上操作) 如果在这个时候的worker节点上操作会得到如下提示:
cause: 还没有配置k8s 的网络,从master节点也可以看到STATUS状态是NotReady 。
开始配置网络
# 配置网络有很多选择,我们这里使用的是 -- calico
老师版本yaml:wget https://docs.projectcalico.org/v3.14/manifests/calico.yaml
我实验版本yaml:wget https://github.com/projectcalico/calico/blob/v3.16.9/manifests/calico.yaml
# 导入镜像
导入github 下载下来的tar包镜像到每个节点的服务器
# 老版本Calico 安装 v3.14 ====================
sudo docker load -i calico_3_14.tar
# 找到这个地方
vim calico.yaml
# 修改yaml文件参数
# 让yaml文件配置生效
# 验证
# 新版本calico 安装v3.16.9 ====================
release-v3.16.9.tgz 下载安装包后解压
进入 /home/loki/Tools/calico/release-v3.16.9/k8s-manifests
kubectl create -f ./tigera-operator.yaml
修改配置文件(这里的pod 地址改为你master初始化时候用的地址)
/home/loki/Tools/calico/release-v3.16.9/k8s-manifests/custom-resources.yaml
改完配置文件后,执行 kubectl create -f ./custom-resources.yaml
# 使用这个命令来观察和等待每个calico网络Pod的STATUS变成Running进度
watch kubectl get pods -n calico-system
# 如果遇到Terminationg(终结,解雇) 状态的pod,想要强制删除
kubectl delete pod calico-kube-controllers-8b49479fc-nllkd -n calico-system --force --grace-period=0
:NAMESPACE
:NAME
# kubectl 补全小功能设置
# 确认有这个包,如果没有通过 yum install -y bash-completion 安装
原理:kubectl completion bash 命令
vim /etc/profile
source /etc/profile
# 去除一个节点 kubectl drain <节点名> --ignore-daemonsets --force
# 删除一个节点 kubectl delete nodes <节点名>
# 去节点上清除配置 sudo kubeadm reset
# 如果重置配置提示错误,清除一下证书
注意: 如果master 重置后,一定需要重新配置网络
# 集群常见命令
kubectl cluster-info
kuberctl version
kubeadm config view 查看验证文件的结构
PS:上面提示未来的k8s版本将会移除这个命令你,官方推荐使用
kubectl get cm -o yaml -n kube-system kubeadm-config
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
apiVersion: v1 data: ClusterConfiguration: | apiServer: extraArgs: authorization-mode: Node,RBAC timeoutForControlPlane: 4m0s apiVersion: kubeadm.k8s.io/v1beta2 certificatesDir: /etc/kubernetes/pki clusterName: kubernetes controllerManager: {} dns: type: CoreDNS etcd: local: dataDir: /var/lib/etcd imageRepository: registry.aliyuncs.com/google_containers kind: ClusterConfiguration kubernetesVersion: v1.20.1 networking: dnsDomain: cluster.local podSubnet: 10.244.0.0/16 serviceSubnet: 10.96.0.0/12 scheduler: {} ClusterStatus: | apiEndpoints: vm1: advertiseAddress: 192.168.27.216 bindPort: 6443 apiVersion: kubeadm.k8s.io/v1beta2 kind: ClusterStatus kind: ConfigMap metadata: creationTimestamp: "2021-03-08T03:38:29Z" managedFields: - apiVersion: v1 fieldsType: FieldsV1 fieldsV1: f:data: .: {} f:ClusterConfiguration: {} f:ClusterStatus: {} manager: kubeadm operation: Update time: "2021-03-08T03:38:29Z" name: kubeadm-config namespace: kube-system resourceVersion: "222" uid: b58d22d3-8ce2-4eb5-9701-3f82b8ba7cc5
# 保存集群配置
kubectl get cm -o yaml -n kube-system kubeadm-config > configview_new.yaml
# 使用_new.yaml文件进行初始化还原的时候,遇到报错(待研究???)
# 重新初始化的时候,就可以使用上次保存的yaml文件
kubectl get pods
kubectl top nodes
kubectl top pods
Metrics
# 设置metric server 一种监控
# v0.36版本
https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.6/components.yaml
wget https://github.com/kubernetes-sigs/metrics-server/archive/v0.3.6.tar.gz -O metrics-server-v0.3.6.tar.gz
# v0.42版本
wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.4.2/components.yaml
wget https://github.com/kubernetes-sigs/metrics-server/archive/v0.4.2.tar.gz -O metrics-server-v0.4.2.tar.gz
# 所有需要监控的节点都要导入这个镜像包
docker -i metrics-img.tar
# 修改metrics-server-0.3.6版本中的 metrics-server-deployment.yaml 文件
/home/loki/Tools/metrics-server/metrics-server-0.3.6/deploy/1.8+/metrics-server-deployment.yaml
# 添加和修改下面的参数
注意:保持yaml文件的对齐关系
# 查看部署结果
kubectl -n kube-system get pods -l k8s-app=metrics-server
kubectl top nodes
kubectl top pods -n kube-system # 查看名称空间kube-system 下的pods资源使用情况
注: 物理CPU一个核心 分城1024份, 每一份叫做一个 微核心 m
# 如果出现下面的显示,可能会出现下面的问题
了解namespace
作用: 不同的应用不同的程序空间用来做分类隔离
# 查看指定命名空间 kubectl get pods -n <空间名>
#查看指定命名空间(ns是简写) kubectl get ns
# 创建命名空间 kubectl create ns <空间名>
# 切换当前所在的命名空间 kubectl config set-context --current --namespace=<名称空间>
# Kubenes 工具(命名空间简化操作工具) 适合生产环境方便和简化切换
多集群切换
简单粗暴修改config文件版本
集群蓝绿部署;同时管理多个集群,并且无缝切换
文件位置: ~/.kube/config
# 删除了密钥后的简略内容如下
# 查看当前集群数量 kubectl config get-contexts
clusters: 集群
contexts: 集群上下文(命名空间,用户名...)
users: 用户信息
# 最后复制2个集群的证书Token值到模板
PS:注意复制的时候字段:前留1个空格问题
# 不然就会出现下面报错,提示值有问题 kubectl config get-contexts
# 查看当前上下文 kubectl config get-contexts
# 切换上下文 kubectl config use-context <NAME>
etcd流程
不属于Kubernets组件,但是又是Kubernets必须的一个组件
# etcd可以单独拿出来做为一个服务器
etcd集群
Leader (主节点,选举)
Follower (读)
Candidate 重新选举前(如果有Leader挂掉,重新投票选举)
# 搭建etcd集群的时候,尽可能的使用奇数个节点
etcd有两个版本(两个版本管理数据方式不一样)
v2
v3: 都是以键值对的方式 aa=bb key=value
开启方式
实验:单独一台机器来做etcd集群实验
1. 了解单节点集群
yum install etcd -y
etcd相互通讯 2380端口
客户端连接etcd 2379端口
修改etcd.conf 配置文件 /etc/etcd/etcd.conf
修改完毕后重启服务 sudo systemctl restart etcd
# 查看我们在哪个节点 etcdctl member list
# 查看etcd节点 状态 etcdctl cluster-health
# 数据存储在(配置文件里面指定的路径)
# 验证,可以使用etcdctl + 常用指令参考下文
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
NAME: etcdctl - A simple command line client for etcd. WARNING: Environment variable ETCDCTL_API is not set; defaults to etcdctl v2. Set environment variable ETCDCTL_API=3 to use v3 API or ETCDCTL_API=2 to use v2 API. USAGE: etcdctl [global options] command [command options] [arguments...] VERSION: 3.3.11 COMMANDS: backup backup an etcd directory cluster-health check the health of the etcd cluster mk make a new key with a given value mkdir make a new directory rm remove a key or a directory rmdir removes the key if it is an empty directory or a key-value pair get retrieve the value of a key ls retrieve a directory set set the value of a key setdir create a new directory or update an existing directory TTL update update an existing key with a given value updatedir update an existing directory watch watch a key for changes exec-watch watch a key for changes and exec an executable member member add, remove and list subcommands user user add, grant and revoke subcommands role role add, grant and revoke subcommands auth overall auth controls help, h Shows a list of commands or help for one command
2. 多节点集群
/etc/etcd/etcd.conf # 多个配置文件复制到不同节点
ETCD_INITIAL_CLUSTER_TOKEN= Token 多个节点的值要保持一样
new 初始化集群
# 其他节点上要修改下配置文件IP
修改完毕后,再次重启服务 sudo systemctl restart etcd
# 注意如果有一个节点刚加入的时候配置文件错误,出现类似单机的结果:
排查思路:
1. 仔细检查配置文件是否正确,尤其是3个节点的名字是否都填写
2. 如果是"new"需要所有节点都清除数据库(rm -rf /var/lib/etcd/default.etcd/)或者用"existing"参数进行加入集群
# 验证,测试数据同步 etcdctl member list
# etcd集群健康检查 etcdctl cluster-health
etcdctl ls /
etcdctl mkdir /目录名
# V3 验证方式
切换v3 export ETCDCTL_API=3,切换成功后etcdctl --help 命令会变多
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
[loki@vm2 ~]$ etcdctl --help NAME: etcdctl - A simple command line client for etcd3. USAGE: etcdctl VERSION: 3.3.11 API VERSION: 3.3 COMMANDS: get Gets the key or a range of keys put Puts the given key into the store del Removes the specified key or range of keys [key, range_end) txn Txn processes all the requests in one transaction compaction Compacts the event history in etcd alarm disarm Disarms all alarms alarm list Lists all alarms defrag Defragments the storage of the etcd members with given endpoints endpoint health Checks the healthiness of endpoints specified in `--endpoints` flag endpoint status Prints out the status of endpoints specified in `--endpoints` flag endpoint hashkv Prints the KV history hash for each endpoint in --endpoints move-leader Transfers leadership to another etcd cluster member. watch Watches events stream on keys or prefixes version Prints the version of etcdctl lease grant Creates leases lease revoke Revokes leases lease timetolive Get lease information lease list List all active leases lease keep-alive Keeps leases alive (renew) member add Adds a member into the cluster member remove Removes a member from the cluster member update Updates a member in the cluster member list Lists all members in the cluster snapshot save Stores an etcd node backend snapshot to a given file snapshot restore Restores an etcd member snapshot to an etcd directory snapshot status Gets backend snapshot status of a given file make-mirror Makes a mirror at the destination etcd cluster migrate Migrates keys in a v2 store to a mvcc store lock Acquires a named lock elect Observes and participates in leader election auth enable Enables authentication auth disable Disables authentication user add Adds a new user user delete Deletes a user user get Gets detailed information of a user user list Lists all users user passwd Changes password of user user grant-role Grants a role to a user user revoke-role Revokes a role from a user role add Adds a new role role delete Deletes a role role get Gets detailed information of a role role list Lists all roles role grant-permission Grants a key to a role role revoke-permission Revokes a key from a role check perf Check the performance of the etcd cluster help Help about any command OPTIONS: --cacert="" verify certificates of TLS-enabled secure servers using this CA bundle --cert="" identify secure client using this TLS certificate file --command-timeout=5s timeout for short running command (excluding dial timeout) --debug[=false] enable client-side debug logging --dial-timeout=2s dial timeout for client connections -d, --discovery-srv="" domain name to query for SRV records describing cluster endpoints --endpoints=[127.0.0.1:2379] gRPC endpoints --hex[=false] print byte strings as hex encoded strings --insecure-discovery[=true] accept insecure SRV records describing cluster endpoints --insecure-skip-tls-verify[=false] skip server certificate verification --insecure-transport[=true] disable transport security for client connections --keepalive-time=2s keepalive time for client connections --keepalive-timeout=6s keepalive timeout for client connections --key="" identify secure client using this TLS key file --user="" username[:password] for authentication (prompt if password is not supplied) -w, --write-out="simple" set the output format (fields, json, protobuf, simple, table)
如何对etcd的数据进行备份(etcd v3 版本 快照实验)
# 做快照的话只能在3版本里来做
# 因为测试环境没有证书,所以直接这样进行快照
如何对etcd的数据进行恢复快照
# 在每个节点上停止etcd,并且快照文件snap1.db复制到每个节点上
sudo systemctl stop etcd # 停止每个节点的etcd服务
sudo rm -rf /var/lib/etcd/* # 清除每个节点的数据库目录
# 最好切换root身份执行,下面命令,切换root后需要再次执行一次切换v3版本命令
PS: 不切换root身份,创建etcd数据库文件夹的时候会提示权限不足
export ETCDCTL_API=3
etcdctl snapshot restore snap1.db --name etcd-217 --initial-cluster etcd-217=http://192.168.27.217:2380,etcd-218=http://192.168.27.218:2380,etcd-219=http://192.168.27.219:2380 --initial-advertise-peer-urls http://192.168.27.217:2380 --data-dir /var/lib/etcd/default.etcd
# 注意标黄部分需要,视不同节点修改对应值
执行上面命令后修改一下权限 chown -R etcd.etcd /var/lib/etcd
执行启动 systemctl start etcd # 查询之前删除的数据是否恢复
PS:注意恢复的数据也仅仅是v3版本的
如何往集群里添加及删除
# 加入集群要使用版本2的方式
复制服务器上的配置文件文本 /etc/etcd/etc.conf 到新的etcd节点,修改配置文件
修改"new"为"existing"
添加新节点IP端口名,还有新节点名字
# 最后,到其他节点上面执行下面的命令,告知其他节点有新节点加入集群
export ETCDCTL_API=2
etcdctl member add etcd-219 http://192.168.27.219:2380 # 只需要在集群里面其中一台执行
最后,在回到新节点上面启动和验证 systemctl start etcd
# 删除节点
etcdctl member remove <节点名>
4. 在k8s你是如何连接到etcd
# 单机k8s etc配置文件存放位置(pod)
CKA-2 pod
# 开始试验环境准备
创建一个叫2-pod命名空间
kubectl create ns 2-pod
# 创建pod kubectl run <PodName> --image=<镜像名> --image-pull-policy=IfNotPresent
# 因为busybox是没有守护进程的一个镜像,所以这里用到了-i -t参数
查看创建的pods kubectl get pods kubectl get pods -o wide
# 查看标签 kubectl get pods --show-labels
# 设置标签 kubectl label pod <PodName> <Key=Values>
# 查看指定标签名的pod kubectl get pods -l <Key=Values>
# 取消标签 kubectl label pod <PodName> <labelsName-> # 注意是一个"-"
# --image-pull-policy=<Values> 三个参数介绍
Always 每次都下载最新镜像 (默认值)
Never 只使用本地镜像
ifNotPresent 本地没有才下载
# 实时监控pod 状态 -w kubectl get pods -w
# 删除pod --force 会比较快速删除pod
Yaml 文件介绍
# yaml文件方式创建
--dry-run=client # 模拟去创建,测试语法
yaml语法简介默认 --> 2个空格
字典: 某个字典里的变量不能有重复,后面的变量会覆盖前面的变量
列表:每个都是一个单独的元素,元素里面都是变量
列表和字典的区别是在yaml里面列表你每一个对象会有一个“-”
kubectl explain pod # 查看第1级有哪些选项可以用.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
KIND: Pod VERSION: v1 DESCRIPTION: Pod is a collection of containers that can run on a host. This resource is created by clients and scheduled onto hosts. FIELDS: apiVersion <string> APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources kind <string> Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds metadata <Object> Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata spec <Object> Specification of the desired behavior of the pod. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status status <Object> Most recently observed status of the pod. This data may not be up to date. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
kubectl explain pod.metadata # 查看第2级有哪些选项可以用
kubectl explain pod.spec.containers # 以此类推
# 让yaml文件生效 kubectl apply -f <YAML文件>
# 删除yaml创建的pod kubectl delete -f <YAML文件> kubect delete -f <YAML文件> --force
利用YAML模板的优势可以方便的替换pod模板
sed 's/pod3/pod4/' pod3.yaml # 可以看到你利用模板创建pod4的主机
如果想要临时替换一些值,并应用可以:
sed 's/pod3/pod4/' pod3.yaml | kubectl apply -f -
# 最后的 "-" 让前面输出的结果生效并应用到k8s(快速相同模板,创建不同pod)
pod和容器使用相同的共享网络空间
# 查看pod 里面的详细信息 kubectl describe pod <PodName>
# 进入pod 里面 kubectl exec <PodName> -- <Command>
# 获取shell kubect exec -it <PodName> -- <bash Or sh>
主:如果pod下面有多个容器 "-c" 容器名
# 查看容器里面的logs信息 kubect logs <Podname> -c <子容器名>
# cp 操作 kubectl cp <源地址> <PodName>:<目标地址> -c <子容器名>
# 查看某个pod的yaml文件 kubectl get pods pod1 -o yaml > pod1.yaml
pod 运行的生命周期
restartPolicy: # 重启策略
Always 总是重启
Never 永不重启
OnFailure 非正常结束才重启
3种写的方式(需练习)
# 1. 手动修改切记注意缩进
# 2. 参数上面字典和列表要注意区分,划线这部分开始第一位需要加"-"
第一种
第二种
第三种(使用命令导出模板的默认值)
kubectl run pod7 --image=busybox --dry-run=client -o yaml -- sh -c sleep 60 > pod7.yaml
默认是30s的宽限期 ,如果30秒还没有结束,将会被强制删除。这种删除pod的方式叫做 优雅的关闭pod
# 如何修改这个宽限时间,通过explanin命令查看命令提示
postStart: 容器启动的时候会同步运行这个
preStop: 容器关闭的时候会同步关闭这个
yaml文件--变量的值只能是字符串,不能写纯数字
初始化容器
# 作用:提前做一些准备工作
alpine
# 容器为了安全,默认不允许容器修改内核参数
# 注意command 命令行[]里面的参数不能有空格
# 初始化容器,先准备一些数据,例子:
静态Pod static pod
不受master的管理,完全由节点kubelet来管理
写好一个yaml文件,放在特定的目录里,kubelet会自动应用这个yaml文件
systemctl status kubelet
# 这里是在非master节点上操作的(work节点上做)
--pod-manifest-path=/etc/kubernetes/xx
Master 节点
# 此静态pod的作用是什么
使用场景比较单一,一般用于维护提示(或者master节点没有启动想要启动的pod,直接放到系统默认指定的特定目录)
pod调度
# 查看节点详情
kubectl describe nodes <节点名>
# 手动指定调度pod的创建位置
1. 指定pod运行在某个节点上,修改yaml文件的方式
2. 通过标签的方式
# 查看标签
# 标签的格式,kv键值对
# 去除键值,用"-"
kubectl label nodes vm1 node-role.kubernetes.io/control-plane-
kubectl label nodes vm1 node-role.kubernetes.io/master-
# 设定节点的Roles名 kubectl label nodes <WorkNode> node-role.kubernetes.io/<想要设置的名字>=
# 设置所有节点标签 kubectl label nodes --all <Key=Values>
# 取消设置的 kubectl label nodes --all Key-
# 显示指定标签的节点 kubectl get node -l <Key=Values>
Pending(挂起) # 指定的创建节点并不存在,会出现Pending状态
# 标签覆盖(如果已经设置了标签,再次设置标签) --overwrite
主机亲和性
# 硬策略;如果没有满足条件出现“Peding”
# 软策略;优先在满足策略的条件下运行,如果不满足去其他节点运行
containers: - image: nginx imagePullPolicy: IfNotPresent name: nginx resources: {} affinity: nodeAffinity: # requiredDuringSchedulingIgnoredDuringExecution: # 硬策略 # nodeSelectorTerms: # - matchExpressions: # - key: kubernetes.io/hostname # operator: In # values: # - vms63.rhce.cc # - vms62.rhce.cc preferredDuringSchedulingIgnoredDuringExecution: # 软策略 - weight: 2 # 多个条件就要比较权重 preference: matchExpressions: - key: bb operator: Gt values: - "3"
警戒线 cordon
# 临时创建5个副本
# 副本数临时增长10个
# 取消维护模式(指定某个节点进入维护模式,不在接受新的pod到此节点)
调度:节点的drain(驱逐)
类似cordon,但是会把已经在节点上面pod驱逐到其他容器上面。
注: drain(驱逐),就是把本地存在的pod删除。
到底能否在其他节点上创建新的pod,取决于这个pod是否通过控制器来控制的
单独创建出来的pod,就不会再运行了
# 如果上面有手动创建的pod,提示如下
# 取消和cordon一样 是用 uncordon
# 查看污点
# 查看指定标签
设置污点和容忍污点
# 给指定节点设置污点 kubectl taint node vm2 <Label_Key:Label_Value>:NoSchedule
# 取消污点 kubectl taint node <Node_Name> <Label_name>-
Tips: 如果想在master上单机运行k8s的pod,就需要取消污点