k8s - 常用命令
k8s
0. k8s安装
https://www.cnblogs.com/raorao1994/p/15305011.html
https://blog.csdn.net/Andy_Health/article/details/128297888?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22128297888%22%2C%22source%22%3A%22Andy_Health%22%7D
问题:
- /etc/yum.repos.d/kubernetes.repo 最后一行不能有回车!!!
- 需要考虑docker版本问题
- k8s 1.17.4 对应docker 19.03
- kubeadm init
kubeadm init --kubernetes-version=v1.17.4 --image-repository registry.aliyuncs.com/google_containers --apiserver-advertise-address 172.16.168.106 --pod-network-cidr=172.16.168.106/16
还需要注册work节点加入集群!
docker卸载旧版本
sudo yum remove docker docker-common docker-selinux docker-engine
按版本号(从高到低)对结果进行排序
yum list docker-ce --showduplicates | sort -r
安装
yum install docker-ce-19.03.13 docker-ce-cli-19.03.13 containerd.io
1.获取加入集群token
kubeadm token list
重新生成
kubeadm token create --print-join-command
如果是添加 worker 节点,不需要执行这一步,直接使用上面返回的 join 命令加入集群。
使用 kubeadm init phase upload-certs --experimental-upload-certs 重新生成certificate-key
添加 master 节点:用上面第1步生成的 join 命令和第2步生成的–certificate-key 值拼接起来执行
断电后,服务器重启了
#强制删除pod
kubectl delete pods upload-78f45bf8fc-wm6jt --grace-period=0 --force
#查看nodes状态
kubectl get nodes
#NoReday需要重启节点kubelet
systemctl restart kubelet.service
2. 创建一个应用
kubectl run nginx-dep --image=nginx:1.7.9 --port=80 --replicas=2
查看pod信息:
kubectl get pods -o wide
查看pod详情:
kubectl describe pod nginx-dep-5779c9d6c9-cwjth
进入容器:
格式:kubectl exec -it podName -c containerName -n namespace – shell comand
kubectl exec -it nginx-dep-5779c9d6c9-cwjth -c nginx-dep /bin/bash
删除pod:
kubectl delete pod nginx-dep-5779c9d6c9-cwjth
删除,停止服务
kubectl get deployment
kubectl delete deployment my-nginx
3. 暴露服务到外网
创建一个service,当新的pod的创建完成后,service会通过pod的label连接到该服务,只需通过service即可访问该服务。通过8080端口即可访问
kubectl expose deployment nginx-dep --name=nginx-svc --port=8080 --target-port=80
查看svc的label配置
kubectl describe svc nginx-svc
外网访问需要修改NodePort参数
kubectl edit svc nginx-svc
查看绑定端口:
192.98.128.158:32243 即可访问
kubectl get svc
4. 服务伸缩
kubectl scale --replicas=4 deployment nginx-dep
5.升级回滚
升级
kubectl set image deployment nginx-dep nginx-dep=nginx:1.9.1
回滚
kubectl rollout undo deployment nginx-dep
6.yaml 文件管理资源(常用)
apiVersion: group/apiversion # 不指定定group,默认为croe
kind: #资源类别
metadata: #资源元数据
name
namespace #k8s自身的namespace
lables
annotations #主要目的是方便用户阅读查找
spec:期望的状态(disired state)
status:当前状态,本字段有kubernetes自身维护,用户不能去定义
创建:
vi nginx-deployment.yaml
apiVersion: apps/v1 # 配置格式的版本
kind: Deployment # 创建的资源类型,这里是deployment
metadata: # 元数据
name: nginx-deployment
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
启动用create
kubectl create -f nginx-deployment.yaml
扩容生效:
kubectl apply -f nginx-deployment.yaml
提供网络,使用service
apiVersion: v1
kind: Service
metadata:
...
创建:
kubectl create -f nginx-svc.yaml
#查看
kubectl get svc
7. pod 调度
- NodeName强制约束: 我们可以使用NodeName指定,来强制约束pod要在某个node上运行
- NodeSelector定向调度 : 通过kubernetes的label-selector机制进行节点选择,由scheduler调度策略MatchNodeSelector进行label匹配,调度pod到目标节点,该匹配规则是强制约束
- NodeAffinity调度: 1)RequiredDuringSchedulingIgnoredDuringExecution :必须满足指定的规则才可以调度Pod到Node上,相当于硬限制 2)PreferredDuringSchedulingIgnoredDuringExecution:强调优先满足指定的规则,相当于软限制,并不强求
8. label作用
- deploy控制器通过label找到对应控制的pods集群
- Service通过label,来绑定port到对应的pods集群,从而提供稳定的服务
9.健康检查(探针)
exec方式: 对于Exec探针,Kubernetes则只是在容器内运行命令。 如果命令以退出代码0返回,则容器标记为健康。
http方式: Kubernetes去访问一个路径,如果它得到的是200或300范围内的HTTP响应,它会将应用程序标记为健康。 否则它被标记为不健康。
10. k8s存储
- emptyDir : Pod挂载在本地的磁盘或者内存,被称为emptyDir ,称为临时空目录,随着Pod删除,也会被删除。
- gitrepo
- hostPath : hostPath类型则是映射node文件系统中的文件或者目录到pod里。可实现针对某一节点的数据持久化,如果节点宕机了,那数据就丢失了
- nfs共享存储卷 : nfs使的我们可以挂在已经存在的共享到的我们的Pod中,nfs不会被删除,仅仅是解除挂在状态而已,这就意味着NFS能够允许我们提前对数据进行处理,而且这些数据可以在Pod之间相互传递.并且,nfs可以同时被多个pod挂在并进行读写
nfs:
安装
配置
启动并查看
挂载
需要在所有节点安装 nfs-utils
组件,否则当Pod被分配到没有组件的节点,会启动失败,因为没有mount.nfs
安装nfs:yum install -y nfs-utils
挂载nfs:mount -t nfs master1:/data/volumes /nfs(没有则先新建nfs目录)
解除挂载:umount /nfs
查看挂载效果:mount
进入node节点,可查看/mnt目录下文件与master已互通
测试:
先在nfs服务内,加一个html测试页面
echo ‘
NFS success
’ > /data/volumes/index.html创建一个pod测试:
运行pod后测试,可看到nginx输出页面
你还可以测试pod的删除重建,丝毫不影响pod服务效果
11. K8S网络
1、Pod内容器间的通讯
K8s的用处是容器的编排和管理,但最小组成却不是容器,是pod。物理机或者虚拟机叫node,pod是基础单元,pod里可以有多个容器,也可以只有一个容器,同一个pod的容器彼此是共享网络和主机配置的,换句话说,彼此是可以直接localhost通信的,类似于同一台机器上进行通信,所以这里面是无所谓隔离和安全一说,对外而言就是一个环境,所以pod就是这个环境的业务实体。如下图:
创建一个多容器的pod,在容器内,你可以查看到它们的ip地址是同一个。
查看每个容器的ip地址:
这也告诉我们,同一个pod内共享网络,容器间的port是互斥的,你无法让pod内的两个容器使用同一个port
2、 Pod间的容器通讯
两个pod间的网络通讯,可以直接理解为两台主机的ip通讯
只要能寻址到对方pod的ip,就轻松通讯了
在K8s的集群虚拟的ip中,ip网段是根据node节点来分配的,每个node节点得一个独立的ip子网段,如下例的3个pod集群:
可以看到,节点work2上的所有pod处理同一个网段,work3的pod处于另一个网段。很明显,work2上的两台pod处于同一个子网,网络天然是通的。但是K8s还为我们多做了一步,即work2与work3上的网络,相互之间也是畅通无阻的。这里就用到了k8s的网络插件的功能,常用的就是flannel
3、 flannel原理
flannel组建一个大二层扁平网络,pod的ip分配由flannel统一分配,通讯过程也是走flannel的网桥。
每个node上面都会创建一个flannel0虚拟网卡,用于跨node之间通讯。所以容器直接可以直接使用pod id进行通讯。
跨节点通讯时,发送端数据会从docker0路由到flannel0虚拟网卡,接收端数据会从flannel0路由到docker0。
==================================================
资源文件创建pod
kubectl create -f job-single.yaml
更多推荐
所有评论(0)