kubectl集群管理命令详解
Kubernetes提供的集群控制平面(master节点)与Kubernetes APIServer通信的命令行工具——kubectl。kubectl默认配置文件目录$HOME/.kube/config。可以通过 --kubeconfig 参数来指定kubectl的配置文件。
以下操作如果已经做过了,就可以跳过。
(1)创建myhello-rc.yaml并写入如下内容:
vim myhello-rc.yaml
内容:
apiVersion: v1
kind: ReplicationController # 副本控制器 RC
metadata:
namespace: default
name: myhello-rc # RC名称,全局唯一
labels:
name: myhello-rc
spec:
replicas: 5 # Pod副本期待数量
selector:
name: myhello-rc-pod
template: # pod的定义模板
metadata:
labels:
name: myhello-rc-pod
spec:
containers: # Pod 内容的定义部分
- name: myhello #容器的名称
image: nongtengfei/hello:1.0.0 #容器对应的 Docker Image
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
env: # 注入到容器的环境变量
- name: env1
value: "k8s-env1"
- name: env2
value: "k8s-env2"
通常不会去单独的配置pod,都是通过某一类副本控制器资源去部署pod。原因:如果单独配置pod,当集群升级时需要将当前节点上的所有pod排空,那么会产生问题,因为pod没有任何副本控制器在控制它,集群对他没有预期,当节点排空后,pod将不会被调度和重生。
(2)为RC创建service。
vim myhello-svc.yaml
内容:
apiVersion: v1
kind: Service
metadata:
name: myhello-svc
labels:
name: myhello-svc
spec:
type: NodePort # 对外提供端口
ports:
- port: 80
protocol: TCP
targetPort: 80
name: http
nodePort: 30000
selector:
name: myhello-rc-pod
(3)应用配置。
kubectl apply -f myhello-svc.yaml -f myhello-rc.yaml
(1)创建myapp-deployment.yaml并写入如下内容:
vim myapp-deployment.yaml
内容:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deployment
labels:
name: myapp-deploy
spec:
replicas: 5
selector:
matchLabels:
name: myapp-deploy-pod
template:
metadata:
labels:
name: myapp-deploy-pod
spec:
#nodeSelector:
#nodetype: worker
containers: # Pod 内容的定义部分
- name: myhello #容器的名称
image: nongtengfei/hello:1.0.0 #容器对应的 Docker Image
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
env: # 注入到容器的环境变量
- name: env1
value: "k8s-env1"
- name: env2
value: "k8s-env2"
resources:
requests:
cpu: 100m
- name: myredis #容器的名称
image: redis #容器对应的 Docker Image
imagePullPolicy: IfNotPresent
ports:
- containerPort: 6379
env: # 注入到容器的环境变量
- name: env1
value: "k8s-env1"
- name: env2
value: "k8s-env2"
resources:
requests:
cpu: 100m
(2)为deployment创建service。
vim myapp-svc.yaml
内容:
apiVersion: v1
kind: Service
metadata:
name: myapp-svc
labels:
name: myapp-svc
spec:
type: NodePort # 对外提供端口
ports:
- port: 80
protocol: TCP
targetPort: 80
name: http
nodePort: 30001
selector:
name: myapp-deploy-pod
(3)应用配置。
kubectl apply -f myapp-svc.yaml -f myapp-deployment.yaml
(1)创建myapp-deployment.yaml并写入如下内容:
vim myapp-ds.yaml
内容:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: myapp-ds
namespace: default
labels:
app: myapp-ds
spec:
selector:
matchLabels:
app: myapp-ds
template:
metadata:
labels:
app: myapp-ds
spec:
tolerations:
- key: node-role.kubernetes.io/control-plane
operator: Exists
effect: NoSchedule
containers: # Pod 内容的定义部分
- name: myhello #容器的名称
image: nongtengfei/hello:1.0.0 #容器对应的 Docker Image
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
env: # 注入到容器的环境变量
- name: env1
value: "k8s-env1"
- name: env2
value: "k8s-env2"
(2)为DaemonSet创建service。
vim myapp-ds-svc.yaml
内容:
apiVersion: v1
kind: Service
metadata:
name: myapp-ds-svc
labels:
name: myapp-ds-svc
spec:
type: NodePort # 对外提供端口
ports:
- port: 8080
protocol: TCP
targetPort: 80
name: http
nodePort: 30002
selector:
app: myapp-ds
(3)应用配置:
kubectl apply -f myapp-ds-svc.yaml -f myapp-ds.yaml
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 45h
myapp-ds-svc NodePort 10.96.41.180 <none> 8080:30002/TCP 4m3s
myapp-svc NodePort 10.98.20.127 <none> 80:30001/TCP 6m32s
myhello-svc NodePort 10.106.252.61 <none> 80:30000/TCP 14m
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-deployment-5659dbddd8-l6m87 0/2 Pending 0 6m41s
myapp-deployment-5659dbddd8-lxxls 0/2 Pending 0 6m41s
myapp-deployment-5659dbddd8-pqqlx 0/2 Pending 0 6m41s
myapp-deployment-5659dbddd8-xb8xp 0/2 Pending 0 6m41s
myapp-deployment-5659dbddd8-zjgsx 0/2 Pending 0 6m41s
myapp-ds-2zqf9 1/1 Running 0 2m43s
myhello-rc-2tjmr 0/1 Pending 0 12m
myhello-rc-44ksd 0/1 Pending 0 12m
myhello-rc-86g79 0/1 Pending 0 12m
myhello-rc-df225 0/1 Pending 0 12m
myhello-rc-lfbzb 0/1 Pending 0 12m
这里只建立了一个节点,所有只有一个pod。
# 安装自动补全插件
sudo apt-get install -y bash-completion
# 添加.bashrc文件内容
echo "source <(kubectl completion bash)" >> ~/.bashrc
# 加载最新的.bashrc
source ~/.bashrc
显示节点或pod的资源(cpu/memory)使用情况,必须安装metrics server。
# 显示所有node资源使用情况
kubectl top node
# 显示某个node(k8s-master1)资源显示情况
kubectl top node k8s-master1
# 显示label 为nodetype=master 的节点资源使用情况
kubectl top node -l nodetype=master
# 显示所有pod 资源使用情况
kubectl top pod
# 显示所有容器资源使用情况
kubectl top pod --containers
# 显示label 为name=myapp-deploy-pod 的pod资源使用情况
kubectl top pod -l name=myapp-deploy-pod
标记节点为不可调度。
# 将节点设置为不可调度
kubectl cordon <nodename>
标记节点为可调度的。
# 将节点设置为可调度
kubectl uncordon <nodename>
腾空节点,准备维护。该操作会自动将节点设置为不可调度状态。
# 腾空指定节点,包括未声明控制器的POD,忽略守护守护进程POD
kubectl drain <nodename> --force --ignore-daemonsets
# 指定宽限期,即pod正常结束的实践,若超过该时间将会被强制杀死
kubectl drain <nodename> --force --ignore-daemonsets --grace-period=60
更新一个或多个节点污点。污点(taint)和 容忍度(toleration)相互配合,可以用来避免pod被分配到不合适的节点。污点格式:key=value:effect,key和value用户自定义,effect取值范围为:NoSchedule, PreferNoSchedule 或 NoExecute。
NoSchedule 表示Kubernetes不会将pod调度到该节点,但是已经在该节点上运行的pod不受影响。
PreferNoSchedule 表示Kubernetes会尽量避免将pod调度到该节点,但不是强制的NoExecute 表示Kubernetes不会将pod调度到该节点并且会将该节点上的pod驱逐。
# 添加污点key=key1,effect=NoSchedule
kubectl taint node k8s-node1 key1:NoSchedule
# 添加污点 key=key1,value=value1,effect=PreferNoSchedule
kubectl taint node k8s-node1 key1=value1:PreferNoSchedule
# 添加污点 key=key1,value=value1,effect=NoExecute
kubectl taint node k8s-node1 key1=value1:NoExecute
# 修改已存在的污点
kubectl taint node k8s-node1 --overwrite key1=v1:NoSchedule
# 删除污点
kubectl taint node k8s-node1 key1=v1:NoSchedulekubectl taint node k8s-node1 key1-
节点设置污点后,根据情况会出现pod不被调度到该节点或者从该节点上驱逐等情况。若pod想继续在有污点的节点上运行,则必须设置容忍度,容忍节点所有污点。tolerations 字段设置pod容忍度。
tolerations:
- key: k1
operator: "Equal"
value: v1
effect: NoExecute
tolerationSeconds: 3600
- key: k2
operator: "Exists"
effect: NoSchedule
- effect: NoSchedule
operator: "Exists"
容忍度与污点通过key、value、effect三个字段来匹配。operator 表示匹配规则,Equal 表示 容忍度与污点key、value、effect必须相等,才能容忍该污点;Exists 表示容忍度与任意的key、value、effect都匹配。
以上配置解读:
第一条:容忍key值为k1且value值为v1且effect值为NoExecute的污点,容忍时间为3600秒,超时后将被驱逐出该节点;
第二条:容忍key值为k2且effect值为NoExecute的污点;
第三条:容忍effect值为NoExecute的污点。
(1)污点设置。和label设置差不多。
kubectl taint node k8s-node1 k1=v1:NoSchedule
kubectl taint node k8s-node1 k2=v2:NoExecute
(2)pod 容忍度设置。
# pod 容忍度设置
tolerations:
- key: k1
operator: "Equal"
value: v1
effect: NoSchedule
- key: k2
operator: "Exists"
effect: NoExecute

我想用ruby编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,
我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions
我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功
我有一个问题。我想从另一个ruby脚本运行一个ruby脚本并捕获它的输出信息,同时让它也输出到屏幕。亚军#!/usr/bin/envrubyprint"Enteryourpassword:"password=gets.chompputs"Hereisyourpassword:#{password}"我运行的脚本文件:开始.rboutput=`runner`putsoutput.match(/Hereisyour(password:.*)/).captures[0].to_s正如您在此处看到的那样,存在问题。在start.rb的第一行,屏幕是空的。我在运行程序中看不到“输入您的密
有这样的事吗?我想在Ruby程序中使用它。 最佳答案 试试这个http://csl.sublevel3.org/jp2a/此外,Imagemagick可能还有一些东西 关于ruby-是否有将图像文件转换为ASCII艺术的命令行程序或库?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6510445/
如何在Ruby的if语句中检查bash命令的返回值(true/false)。我想要这样的东西,if("/usr/bin/fswscell>/dev/null2>&1")has_afs="true"elsehas_afs="false"end它会提示以下错误含义,它总是返回true。(irb):5:warning:stringliteralincondition正确的语法是什么?更新:/usr/bin/fswscell寻找afs安装和运行状态。它会抛出这样的字符串,Thisworkstationbelongstocell如果afs没有运行,命令以状态1退出 最
在几个项目中,我希望有一个类似rakeserver的rake任务,它将通过任何需要的方式开始为该应用程序提供服务。这是一个示例:task:serverdo%x{bundleexecrackup-p1234}end这行得通,但是当我准备停止它时,按Ctrl+c并没有正常关闭;它中断了Rake任务本身,它说rakeaborted!并给出堆栈跟踪。在某些情况下,我必须执行Ctrl+c两次。我可能可以用Signal.trap写一些东西来更优雅地中断它。有没有更简单的方法? 最佳答案 trap('SIGINT'){puts"Yourmessa