⑴ k8s常用命令
docker run busybox echo "hello world"
docker run --name kubia-container -p 8080:8080 -d kubia
docker build -t kubia .
docker images
docker ps
docker exec -it kubia-container bash
docker stop kubia-container
docker rm kubia-container
docker tag kubia luksa/kubia
docker login
docker push luksa/kubia
docker logs <container id>
kubectl run kubia --image=luksa/kubia --port=8080
kubectl expose pod kubia <--type=LoadBalancer --name kubia-http> (type指定svc类型默认clusterip,name指定svc名称)
kubectl get ... (#-o wide列出pod ip和运行节点 #-o yaml输出格式 #--show-lables列出标签#-L列出指定标签)
kubectl describe ...
kubectl cluster-info
kubectl explain pod
kubectl explain pod.spec
kubectl create -f kubia-manual.yaml
kubectl logs <pod> -c <container id> (#--previous获取奔溃容器的日志)
kubectl port-forward kubia-manual 8888:8080
参考: https://stackoverflow.com/questions/33517646/unable-to-do-port-forwarding-socat-not-found-kubernetes-on-docker
kubectl label po <pod name> <key=value> #添加
kubectl label po <pod name> <key=value> --overwrite #修改
kubectl annotate
kubectl delete po <pod name> (--all 所有poad)
kubectl delete po -l
kubectl delete ns #删除整个命名空间
kubectl delete all --all (删除所有资源)
128+9(SIGKILL) 进程强制终止,此时会创建一个腔搏全新容器
128+15(SIGTERM)
initalDelaySeconds 设置延迟来说明应用程序启动时间
kubectl delete rc kubia --cascade=false
kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}'
export CURL_CA_BUNDLE=/var/run/secrets/kubernetes.io/伍渣祥serviceaccount/ca.crt
TOKEN= TOKEN" https://kubernetes
kubectl create clusterrolebinding permissive-binding --clusterrole=cluster-admin --group=system:serviceaccounts
kubectl apply -f nginx-test.yaml
kubectl delete -f nginx-test.yaml #删除YAML文件中定义的资梁轮源
kubectl get deployment nginx-test -o yaml
kubectl create deployment test --image=nginx:1.7.9 --dry-run=client -o yaml > nginx.yaml
kubectl api-versions #查看K8S所支持API版本
kubectl api-resources #查看K8S所有资源类型
kubectl explain pods #发现api对象字段
kubectl explain pods.spec#了解各个属性更多信息
kubectl apply -f pod-demo.yaml
kubectl get pods #查看容器是否运行,正常情况应该是Running
kubectl get pods -o wide #查看pod详细信息,包含了IP、所属Node等
kubectl get pods --show-labels #查看资源标签
kubectl get pods -L creation_method,env #将creation_method,env标签展示在列表上
kubecl label pods kubia-manual creation_method=manual #添加标签
kubecl label pods kubia-manual env=debug --overwrite #修改标签--overwrite选项
kubectl get namespaces #查看namespace
kubectl get pods -n kube-system #显示指定namespace的pod
kubectl describe pods pod-demo
kubectl delete pods <pod name> #按名称删除
kubectl delete pods -l <label> #按标签删除<namespace> #删除整个命名空间来删除pod
kubectl delete pods --all #删除命名空间中的所有pod
kubectl delete all --all #删除命名空间中的几乎所有资源,pod rc svc
kubectl delete rc kubia --cascade=false #只删除 ReplicationController 并保待 pod 运行
kubectl logs mypod
kubectl logs mypod --previous #查看前一个容器的日志
退出状态码是两个数字的总和:128+x, 其中x是终止进程的信号编号
http://kubernetes.io/docs/user-guide/jsonpath
主要用于Pod调度和驱逐,优先级越低的QOS越容易被驱逐。不同QOS优先级不同,使用kubectl describe命令可以查看Qos Class:
· BestEffort:尽可能的为Pod分配资源,默认不进行requests设置就是该QOS,优先级最低
· Burstable:资源可波动,requests小于limit的值就是该QOS,推荐
· Guaranteed:完全可保障资源,必须使用requests和limit定义内存和CPU两项资源并且相等,优先级最高
由于每个节点都有 一个唯 一标签 , 其中 键为kubernetes.io/hostname,值为该 节点的 实际主机名
kubectl annotate pods <podname> <key=value>
⑵ K8S安装和创建集群终极教程(单master多worker)
本文会以 最简单 、 最直接 、 最完整 的方式记录kubernetes(下面统称K8S)单master多工作节点(worker nodes)的集群步骤
首先要简单了解一下本文的3个核心概念:
内存建议至少4G
问:如何查看主机名?
答:执行命令hostname
问:如何修改主机名?
答:永久生效的做法:执行命令vi /etc/hostname,把第一行去掉(不能注释掉,要去掉),然后重新写上自定义的主机名(注意命名规范),保存并重启后生效;
临时生效的做法:执行以下命令
问:如何查看MAC地址?
答:执行命令ip link,然后看你的第一网卡
问:如何查看proct_uuid?
答:执行命令sudo cat /sys/class/dmi/id/proct_uuid
注意:30000-32767这个端口范围是我们创建服务的端口必须要设置的一个范围(如果设置范围以外的会有限制提示并创建失败),这是K8S规定的。
另外,如果你要直接关闭防火墙可以执行
⑥必须禁用Swap
Swap total大于0,说明Swap分区是开启的
问:如何关闭Swap?
答:编辑文件/etc/fstab,在swap行前面加上#号注释, 保存并重启服务器
再次查看分区状态,已生效
常见的容器引擎(Container runtime,简称runtime):
本文使用的容器引擎是Docker
安装完成后查看版本:
当出现可能跟Docker引擎相关的奇怪异常时可以尝试把Docker卸载干净并重新安装,但一定要注意镜像、容器、卷或配置文件这些是否需要备份。
下面记录卸载Docker引擎的步骤:
①卸载 Docker Engine、CLI 和 Containerd 包:
②主机上的映像、容器、卷或自定义配置文件不会自动删除。删除所有镜像、容器和卷:
③配置文件如果有不合法的字符时会导致启动失败,我们需要将其删除然后重建
此时Docker引擎已卸载干净
官网用的是谷歌的yum源,因为国内是连不上的,所以这里替换成阿里提供的yum源
①安装
从安装信息中可以看到版本号是1.22
Installing:
kubeadm x86_64 1.22.4-0 kubernetes 9.3 M
kubectl x86_64 1.22.4-0 kubernetes 9.7 M
kubelet x86_64 1.22.4-0 kubernetes 20 M
②启动
这就是一个驱动程序,注意cgroup和cgroupfs不要混淆了
引用官方的一段话
“由于 kubeadm 把 kubelet 视为一个系统服务来管理,所以对基于 kubeadm 的安装, 我们推荐使用 systemd 驱动,不推荐 cgroupfs 驱动。”
kubeadm默认是使用systemd 驱动,而我们的Docker默认驱动是cgroupfs(docker info可以查看),所以需要将Docker的驱动改成systemd
①编辑Docker配置文件
②重启Docker服务
再次docker info查看驱动信息已变成了systemd
工作节点(worker nodes)的最小配置就到这里了
①镜像源参数说明
默认情况下, kubeadm 会从 k8s.gcr.io 仓库拉取镜像,国内是拉不了的。官方文档明确表示允许你使用其他的 imageRepository 来代替 k8s.gcr.io。
--image-repository 你的镜像仓库地址
接下来我找了一些国内的镜像源,并简单做了下分析
综合上述统计,我选择阿里云的镜像源
②ip地址范围参数说明
--pod-network-cidr =192.168.0.0/16
注意:如果192.168.0.0/16已经在您的网络中使用,您必须选择一个不同的pod网络CIDR,在上面的命令中替换192.168.0.0/16。
集群初始化命令:
因为我用的是演示机器,所以这里把完整的执行信息都贴出来方便查阅,平时工作中一定要注意保护好敏感的信息(我的ip地址范围是自定义的便于下面的功能演示,另外初次init需要下载镜像文件,一般需要等几分钟)
如上所示,集群初始化成功,此时一定要注意看上面执行结果最后的那部分操作提示,我已用标明了初始化成功后还需要执行的3个步骤
注意:如果init成功后发现参数需要调整,可以执行kubeadm reset,它的作用是尽最大努力恢复kubeadm init 或者 kubeadm join所做的更改。
To start using your cluster, you need to run the following as a regular user:
翻译:开始使用集群前,如果你是普通用户(非root),你需要执行以下的命令:
Alternatively, if you are the root user, you can run:
翻译:或者,如果你使用的是root,你可以执行以下命令:
(注意:export只是临时生效,意味着每次登录你都需要执行一次)
网络配置配的就是Pod的网络,我的网络插件选用calico
cidr就是ip地址范围,如果您使用 pod CIDR 192.168.0.0/16,请跳到下一步。
但本文中使用的pod CIDR是192.100.0.0/16,所以我需要取消对清单中的 CALICO_IPV4POOL_CIDR 变量的注释,并将其设置为与我选择的 pod CIDR 相同的值。(注意一定要注意好格式,注意对齐)
可根据需求自定义清单,一般不需要的就直接跳过这步
在所有的工作节点上执行join命令(复制之前初始化成功后返回的加入集群命令到所有的工作节点执行即可)
master上查看所有节点的状态
到这里集群已经创建完成
最后我再安装K8S的可视化界面kubernetes-dashboard,方便我们日常使用
①下载yaml文件
②修改yaml文件,新增type和nodePort,使服务能够被外部访问
③安装并查看运行情况
④新建用户
文件创建完成后保存并apply
⑤获取Token,用于界面登录
⑥登录dashboard
192.168.189.128是我的master服务器ip,另外要注意必须使用https,并且不能使用ie内核模式
复制⑤生成的token到输入框,点击登录
dashboard安装配置完成
问:如何在查看资源情况?
答:在master上执行以下命令可查看资源情况(-o wide是显示更详细的信息),
①查看所有节点
②查看所有命名空间
③查看命名空间下的pod
④查看所有命名空间的pod
⑤实时查看查看命名空间下的pod运行情况
问:kubeadm join 出现异常[ERROR Port-10250]: Port 10250 is in use,如何解决?
答:这是因为你之前join失败过了,需要先执行kubeadm reset再重新join
问:虚拟机上测试时网卡突然消失如何解决(题外问题记录)?
答:
①确认丢失的网卡信息,ens开头(可选步骤)
ifconfig -a
②执行以下命令解决
问:如何查看K8S版本?
答:kubectl version
问:join命令忘记或者过期了怎么办?
答:
生成永不过期的
生成时效24小时的
问:Pod不断重启并且无其它报错信息时怎么办?
答:这种情况通常是因为你的集群中只有master,没有worker节点,master的创建默认是有污点的,即不允许调度新的Pod,如果你需要(当然这并不推荐),就需要删除 master 上的污点。删除污点可以执行以下命令,
它应该返回以下内容。
⑶ k8s常用命令
命令行 敲出的指令分为2种,
资源管理方式分类
直接使用命令去操作k8s资源,命令和参数一起出现
通过命令和配置文件去操作作k8s资源,命令还是那个命令,只不过参数都放在配置文件里面
使用apply创建资源,
说明
在master节点执行以下命令即可删除
还需要在work节点上执行以下命令来清空ini配置
先在主节点创建令牌
然后在需要加入集群的节点中执行令牌,注意这里的命令是通过 kubeadm token create --print-join-command 命令返回的结果
说明
记住,名称中不能用下划线 _ ,可以用横行 - 第一种创建方式–命令行创建
第二种创建方式–命令行 + 配置文件
创建一个名为namespace-dev.yaml的文件,内容如下(注意大小写,kind的头字母必须大写)
然后偶执行命令进行创建
需要注意的是,删除后,当前命名空间下的pod、deployment、 container 也会一起删掉
第一种–使用命令删除
第二种–使用配置文件删除
说明
获取所有namespace的pod并监视资源变动
加上 -w 表示监视资源变动信息,此时命令行进入阻塞状态,如果pod有变化将会马上呈现出来;
其他参数
因为pod里面至少要有一个容器,所以pod是和容器一起创建的,新建一个文件 pod.ymal ,内容如下
然后执行命令并指定配置文件进行创建
以下示例是为pod资源打标签,这种方式是和pod一起创建的,新建一个配置文件 label.yaml
执行命令创建pod
适合更新label值,前提是label的key必须已存在;
删除key为lebelKey的标签
pod控制器有很多种,我们这里就用deployment
使用以下run命令运行一个nginx,deployment名称为 app=run-cmd-nginx-deploy-3
通过以下命令可以看到,会自动生成一个 app=run-cmd-nginx-deploy-3 的标签
新建一个deployment.yaml文件,内容如下
需要注意的是,一旦删除pod控制器,此pod控制器下的所有pod和容器也会一并删除;
默认创建的pod是只能对内访问的,所以需要创建一个对外的访问端口,创建一个service其实就是暴露对外的访问端口
说明
创建好service之后,查看service信息,可以看到,暴露的端口为:30474,
新建一个service.ymal文件,内容如下
以下三种用法都可以
查询pod控制器和pod
Endpoint是kubernetes中的一个资源对象,存储在etcd中,用来记录一个service对应的所有pod的访问地址,它是根据service配置文件中selector描述产生的。
一个Service由一组Pod组成,这些Pod通过Endpoints暴露出来,Endpoints是实现实际服务的端点集合。换句话说,service和pod之间的联系是通过endpoints实现的。
每创建一个service,k8s会自动创建一个同名的 Endpoint出来
如果是由service创建出来的endpoints,删除后会马上创建出一个同名的endpoint出来,如果要删除必须先删除service
因为每次创建一个service,k8s会自动创建一个同名的 Endpoint出来,所我们直接创建service就可以了
--help 用来查看帮助文档,如果你不知道某个命令怎么使用了,就可以用 --help 查询命令的用法
explain用来查看配置文件的 资源结构,如果不知道配置文件中的资源用有哪些结构,那么就可以使用explain命令来查看