一、基本概念及命令行工具kubectl
Kuberntes及容器生态系统
Kubernetes架构
Kubernetes基本概念
部署应用
kubectl run nginx –image=nginx:1.7.9
kubectl get deploy
这一步出现了问题,一直处于ContainerCreating状态。
原因:“image pull failed for gcr.io/google_containers/pause:2.0”。k8s默认从gcr.io/google_containers拉去镜像。无法访问grc.io
解决办法:
修改/etc/hosts文件,添加
61.91.161.217 gcr.io
61.91.161.217 www.gcr.io
再次执行kubectl get deploy
查看应用
kubectl get deploy -o wide
查看更详细的信息
查看pod具体信息
kubectl get pod
查看运行在哪个节点,此IP为docker的ip,并不是固定不变的
kubectl get pod -o wide
查看log并进到获取终端
也可以通过dashboard查看,如下
暴露部署服务,使之能通过外网直接访问
验证部署的服务为什么基于同一个pod
他们都跟192.168.166.129关联。
删除服务
拓展/扩大RS的数量(副本数)
回滚验证(版本升级):
由于镜像问题,不能正常升级。升级是失败的,老版本还活着。可以回滚
回滚
kubernetes有自愈功能,你删除一个pod,它会自己再创建,始终保持3个pod
删除服务
二、Kubernetes的资源调度与资源管理机制(2个元素:Limit Range和Resource Quota)
K8s中调度器模块的基本实现,包括调度场景和功能等,从而帮助用户理解如何配置k8s资源以实现自定义的资源分配。
随着kubernetes集群规模的扩大,kubernetes调度器作为集群的大脑,在如何提高集群的资源利用率、保证集群中服务的稳定运行中也会变得越来越重要。从调度流程、调度算法、资源限制几个方面学习kubernetes调度器。
Kubernetes调度器
Kubernete scheduler主要负责的工作是:接受API Server创建的新pod,并为其安排一个主机,将信息写入etcd中。这个过程中要处理的事情远远没有这么简单,需要综合考虑多种决策因素,比如把一个replication controller的pod分配到不同的主机上,防止因主机节点宕机对业务造成教的冲击;以及如何考虑资源均衡,从而提升整个集群的资源使用率等。
Limit Range
Limit Range设计的初衷是为了满足以下场景:
能够约束租户的资源需求
能够约束容器的资源请求范围
能够约束pod夫人资源请求范围
能够指定容器的默认资源限制
能够指定pod的默认资源限制
能够约束资源请求和限制之间的比例
Resource Quota
Kubernetes是一个多租户架构,当多用户或者团队共享一个Kubernetes系统的时候,系统管理员需要防止租户的资源抢占,定义好资源分配策略。比如Kubernetes系统共有20 核CPU和32GB内存,分配给A租户5核CPU和16GB,分配给B租户5核CPU 和8GB,预留10核CPU和8GB内存。这样,租户中所使用的CPU和内存的总和不能超过指定的资源配额,促使其更合理地使用资源。
Kubernetes提供API对象Resource Quota(资源配额)来实现资源配额,Resource Quota不仅可以作用于CPU和內存,另外还可以限制比如创建Pod的总数目、Service总数目、RC总数目等。
默认情况下,Namespace是没有Resource Quota的,需要另外创建Resource Quota。一旦Namespace中有了Resource Quota,那么创建Pod的时候就必须制定资源请求,否则Pod就会创建失败。
三、K8s存储目前存在的一些问题
- Resource Limitation & Separation(资源限制和分离)
- Data Replication & Snapshot(数据复制和快照)
- Volume Resize and Autoscaling(卷调整和自动调整)
- Monitoring and QoS(监控和QoS)
- AccessMode
- PV Lost
四、PV Controller的初始化过程
五、一个简单的例子
- 在虚拟机中启动一个k8s集群以及配置一个NFS服务器
- 通过NFS暴露一个共享目录
- 创建PV,PVC和Pod,Pod将挂载NFS所暴露的目录
步骤:
1.设置NFS Server
对外暴露/home/centos/allen/nfs-trial目录,并在目录下创建文件abc
vi /etc/exports
/home/centos/allen/nfs-trial *(sync,rw)
执行下个命令之前必须先启动rpcbind,再启动nfs,否则会报错:
service rpcbind start
service nfs start
showmount –e
touch abc
ls .
2.创建PVC
vi pvc.yml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: ""
kubectl create –f pvc.yml
kubectl get pvc
3.创建PV
vi pv.yml
kind: PersistentVolume
apiVersion: v1
metadata:
name: mypv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
nfs:
path: /home/centos/allen/nfs-trial
server: localhost
kubectl create –f pv.yml
kubectl get pvc
kubectl get pv
4.创建Pod
vi pod.yml
kind: Pod
apiVersion: v1
metadata:
name: mypod
spec:
containers:
- name: mycontainer
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
name: "http-server"
volumeMounts:
- mountPath: "/var/data"
name: data
volumes:
- name: data
persistentVolumeClaim:
claimName: myclaim
readOnly: true
kubectl create –f pod.yml
kubectl get pod
5.验证挂载目录
kubectl exec –it mypod /bin/bash
sudo docker ps
sudo docker inspect xxxxxx | grep /var/data
注意:在节点node1上执行该命令,因为容器组mypod在节点node1上
findmnt | grep “/var/lib/kubelet/pods/xxxxxxxx/volumes/kubernetes.io-nfs/mypv”
六、“hello world“示例
web留言板应用:基于PHP+Redis的两层分布式架构的web应用
Hello word 留言板系统
依赖三个镜像:
- docker.io/kubeguide/guestbook-php-frontend:WEB前端。PHP Web服务,在网页上展示留言内容,也提供一个文本输入框供访客添加留言。
- docker.io/kubeguide/redis-master:写留言。用于前端Web应用进行“写”留言的操作,其中已经保存了一条内容为“Hello World!”的留言。
- docker.io/kubeguide/guestbook-redis-slave:读取留言。用于前端Web应用进行“读”留言的操作,并与redis-master的数据保持同步。
声明:如有什么错误还请指正。