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

问题:

  1. /etc/yum.repos.d/kubernetes.repo 最后一行不能有回车!!!
  2. 需要考虑docker版本问题
  3. k8s 1.17.4 对应docker 19.03
  4. 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

k8s - 常用命令_第1张图片
查看绑定端口:
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 调度

  1. NodeName强制约束: 我们可以使用NodeName指定,来强制约束pod要在某个node上运行
  2. NodeSelector定向调度 : 通过kubernetes的label-selector机制进行节点选择,由scheduler调度策略MatchNodeSelector进行label匹配,调度pod到目标节点,该匹配规则是强制约束
  3. NodeAffinity调度: 1)RequiredDuringSchedulingIgnoredDuringExecution :必须满足指定的规则才可以调度Pod到Node上,相当于硬限制 2)PreferredDuringSchedulingIgnoredDuringExecution:强调优先满足指定的规则,相当于软限制,并不强求

8. label作用

  1. deploy控制器通过label找到对应控制的pods集群
  2. Service通过label,来绑定port到对应的pods集群,从而提供稳定的服务

9.健康检查(探针)

exec方式: 对于Exec探针,Kubernetes则只是在容器内运行命令。 如果命令以退出代码0返回,则容器标记为健康。
k8s - 常用命令_第2张图片
http方式: Kubernetes去访问一个路径,如果它得到的是200或300范围内的HTTP响应,它会将应用程序标记为健康。 否则它被标记为不健康。

k8s - 常用命令_第3张图片

10. k8s存储

  1. emptyDir : Pod挂载在本地的磁盘或者内存,被称为emptyDir ,称为临时空目录,随着Pod删除,也会被删除。
  2. gitrepo
  3. hostPath : hostPath类型则是映射node文件系统中的文件或者目录到pod里。可实现针对某一节点的数据持久化,如果节点宕机了,那数据就丢失了
  4. nfs共享存储卷 : nfs使的我们可以挂在已经存在的共享到的我们的Pod中,nfs不会被删除,仅仅是解除挂在状态而已,这就意味着NFS能够允许我们提前对数据进行处理,而且这些数据可以在Pod之间相互传递.并且,nfs可以同时被多个pod挂在并进行读写

nfs:
安装
在这里插入图片描述
配置
在这里插入图片描述
启动并查看
k8s - 常用命令_第4张图片
挂载
需要在所有节点安装 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测试:
k8s - 常用命令_第5张图片
运行pod后测试,可看到nginx输出页面
在这里插入图片描述
你还可以测试pod的删除重建,丝毫不影响pod服务效果

11. K8S网络

1、Pod内容器间的通讯

K8s的用处是容器的编排和管理,但最小组成却不是容器,是pod。物理机或者虚拟机叫node,pod是基础单元,pod里可以有多个容器,也可以只有一个容器,同一个pod的容器彼此是共享网络和主机配置的,换句话说,彼此是可以直接localhost通信的,类似于同一台机器上进行通信,所以这里面是无所谓隔离和安全一说,对外而言就是一个环境,所以pod就是这个环境的业务实体。如下图:
k8s - 常用命令_第6张图片
创建一个多容器的pod,在容器内,你可以查看到它们的ip地址是同一个。
k8s - 常用命令_第7张图片
查看每个容器的ip地址:
k8s - 常用命令_第8张图片
这也告诉我们,同一个pod内共享网络,容器间的port是互斥的,你无法让pod内的两个容器使用同一个port

2、 Pod间的容器通讯

两个pod间的网络通讯,可以直接理解为两台主机的ip通讯
k8s - 常用命令_第9张图片
只要能寻址到对方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。
k8s - 常用命令_第10张图片

==================================================

资源文件创建pod

kubectl create -f job-single.yaml

k8s - 常用命令_第11张图片

你可能感兴趣的:(docker,k8s)