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
问题:
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
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
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
创建一个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
kubectl scale --replicas=4 deployment nginx-dep
升级
kubectl set image deployment nginx-dep nginx-dep=nginx:1.9.1
回滚
kubectl rollout undo deployment nginx-dep
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
exec方式: 对于Exec探针,Kubernetes则只是在容器内运行命令。 如果命令以退出代码0返回,则容器标记为健康。
http方式: Kubernetes去访问一个路径,如果它得到的是200或300范围内的HTTP响应,它会将应用程序标记为健康。 否则它被标记为不健康。
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 ‘
K8s的用处是容器的编排和管理,但最小组成却不是容器,是pod。物理机或者虚拟机叫node,pod是基础单元,pod里可以有多个容器,也可以只有一个容器,同一个pod的容器彼此是共享网络和主机配置的,换句话说,彼此是可以直接localhost通信的,类似于同一台机器上进行通信,所以这里面是无所谓隔离和安全一说,对外而言就是一个环境,所以pod就是这个环境的业务实体。如下图:
创建一个多容器的pod,在容器内,你可以查看到它们的ip地址是同一个。
查看每个容器的ip地址:
这也告诉我们,同一个pod内共享网络,容器间的port是互斥的,你无法让pod内的两个容器使用同一个port
两个pod间的网络通讯,可以直接理解为两台主机的ip通讯
只要能寻址到对方pod的ip,就轻松通讯了
在K8s的集群虚拟的ip中,ip网段是根据node节点来分配的,每个node节点得一个独立的ip子网段,如下例的3个pod集群:
可以看到,节点work2上的所有pod处理同一个网段,work3的pod处于另一个网段。很明显,work2上的两台pod处于同一个子网,网络天然是通的。但是K8s还为我们多做了一步,即work2与work3上的网络,相互之间也是畅通无阻的。这里就用到了k8s的网络插件的功能,常用的就是flannel
flannel组建一个大二层扁平网络,pod的ip分配由flannel统一分配,通讯过程也是走flannel的网桥。
每个node上面都会创建一个flannel0虚拟网卡,用于跨node之间通讯。所以容器直接可以直接使用pod id进行通讯。
跨节点通讯时,发送端数据会从docker0路由到flannel0虚拟网卡,接收端数据会从flannel0路由到docker0。
==================================================
资源文件创建pod
kubectl create -f job-single.yaml