1. Play with kubernetes
使用此网站可以简单搭建kubernetes,提供了一个简易的、无需安装任何软件的 Kubernetes 学习和实验环境。但是他每次创建只会保存四个小时,也就是说四个小时后初始化以及实验的一些数据就清空了。当然有得有失吗,简单的学习是可以使用此平台的。
1.1. 部署前准备
- 进入对应网站Play with Kubernetes,使用GitHub或者Docker账号登陆,然后Start。
- 点击添加多几个节点,一般我们设置一主二从的节点搭配。
1.2. 搭建集群环境
- 选择一个节点作为Master主节点,执行以下命令
1. Initializes cluster master node:初始化集群节点
kubeadm init --apiserver-advertise-address $(hostname -i) --pod-network-cidr 10.5.0.0/16
2. Initialize cluster networking:初始化集群网络
kubectl apply -f https://raw.githubusercontent.com/cloudnativelabs/kube-router/master/daemonset/kubeadm-kuberouter.yaml
3. 打印work节点加入集群的命令
kubeadm token create --print-join-command
会生成如下命令,work节点想要加入到集群执行如下命令即可
kubeadm join 192.168.0.23:6443 --token 9fzz0d.gx4ztvcyscsp6xg9 --discovery-token-ca-cert-hash sha256:f730105a8a4a61049214bc8894c8b7eb92402bae43887191e0ffc412d4cb6d43
4. 执行命令查看集群节点
kubectl get nodes
4. (Optional) Create an nginx deployment:创建一个nginx应用(可选)
kubectl apply -f https://raw.githubusercontent.com/kubernetes/website/master/content/en/examples/application/nginx-app.yaml
- 步骤4链接对应的内容如下:
apiVersion: v1
kind: Service #用于网络分发
metadata:
name: my-nginx-svc
labels:
app: nginx
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: nginx
---
apiVersion: apps/v1
kind: Deployment #用于pod创建
metadata:
name: my-nginx
labels:
app: nginx
spec:
replicas: 3 #3个pod副本
selector:
matchLabels:
app: nginx
template: #pod的期望
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2 #此pod镜像为nginx
ports:
- containerPort: 80
- Master节点执行Yaml文件,便可创建3个Pod,通过kubectl get pod -o wide即可查看
- 通过命令删除其中一个pod
我们发现删除这个Pod后,又新建了一个Pod,这是因为Pod由Deployment管理,在前面Yaml文件的spec下定义了3个replicas,Deployment会将Pod的副本数扩到与定义的副本数相等。
那应该如何删除这些Pod呢?
①删除资源
如果是Deployment
创建的资源,直接删除这个资源将自动终止由它管理的所有Pod:
首先通过标签Lable查到对应的Deployment:
删除deployment:
这会删除在Deployment中定义的所有资源,比如Deployment
以及它创建的所有Pod和相关的副本控制。
②缩放资源副本
如果基于需要临时调整指定Pod的数量,可以缩放Deployment
:
kubectl scale --replicas=0 -f nginx.yaml
这会将Deployment
或ReplicaSet
管理的Pod数量缩减为0,从而删除所有Pod实例。
1.3. 使用kubectl部署
- 创建一个deployment的YAML文件
apiVersion: apps/v1 #与k8s集群版本有关,使用 kubectl api-versions 即可查看当前集群支持的版本
kind: Deployment #该配置的类型,我们使用的是 Deployment
metadata: #译名为元数据,即 Deployment 的一些基本属性和信息
name: nginx-deployment #Deployment 的名称
labels: #标签,可以灵活定位一个或多个资源,其中key和value均可自定义,可以定义多组,目前不需要理解
app: nginx #为该Deployment设置key为app,value为nginx的标签
spec: #这是关于该Deployment的描述,可以理解为你期待该Deployment在k8s中如何使用
replicas: 1 #使用该Deployment创建一个应用程序实例
selector: #标签选择器,与上面的标签共同作用,目前不需要理解
matchLabels: #选择包含标签app:nginx的资源
app: nginx
template: #这是选择或创建的Pod的模板
metadata: #Pod的元数据
labels: #Pod的标签,上面的selector即选择包含标签app:nginx的Pod
app: nginx
spec: #期望Pod实现的功能(即在pod中部署)
containers: #生成container,与docker中的container是同一种
- name: nginx #container的名称
image: nginx:1.7.9 #使用镜像nginx:1.7.9创建container,该container默认80端口可访问
- 执行命令及结果
- 进行扩容操作
- 进行缩容操作
Yaml文件里面的replicas副本数没变,执行 kubectl scale
命令时,Kubernetes通过API与集群进行交互,它改变的是集群中实际运行的资源状态(如副本数量),而不是直接修改您本地或线上存储的 YAML 文件内容。因此,kubectl scale
操作不会改变 YAML 文件里 replicas
的数值。
- YAML文件是Kubernetes资源的声明性配置。在使用
kubectl
(例如kubectl apply
)命令应用到集群时,这些配置被存储在Kubernetes的etcd数据库中。 kubectl scale
直接改变了etcd中存储的资源状态,而YAML文件的内容在本地或储存于版本控制系统中,并不会自动同步或更新。