一、Pod资源
1、Pod简介
Pod是Kubernetes调度的最小单元。一个Pod可以包含一个或多个容器,因此它可以被看作是内部容器的逻辑宿主机。
2、k8s yml主要组成
apiVersion: v1 #api版本kind: pod #资源类型metadata: #属性spec: #详细
3、pod资源定义
vim k8s_pod.yml
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: web
spec:
containers:
- name: nginx
image: 172.1.1.12:5000/nginx:v1
ports:
- containerPort: 80
4、创建并查看结果
创建pod
kubectl create -f ./k8s_pod.yml
查看pod
kubectl get pod -o wide

可以看到已经处于容器创建状态13分钟了,并且没有ip地址分配,那么就是有问题的
5、报错处理
先查看资源详细信息
kubectl describe pod nginx

查看报错发现docker从 registry.access.redhat.com/rhel7/pod-infrastructure:latest 拉取镜像,
报错解决:
修改node节点配置文件,修改为从私有仓库下载
先从docker hub上pod-infrastructure镜像,然后上传至私有仓库
docker pull docker.io/tianyebj/pod-infrastructure
docker tag docker.io/tianyebj/pod-infrastructure:latest 172.1.1.12:5000/pod-infrastructure:latest
docker push 172.1.1.12:5000/pod-infrastructure:latest
然后修改node节点的kubelet配置文件,指定为私有仓库
vim /etc/kubernetes/kubelet
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=172.1.1.12:5000/pod-infrastructure:latest"
重启kubelet服务
systemctl restart kubelet
然后再查看资源信息会增加pull creat start 信息
查看pod发现已经处于running中了
二、Replication Controller资源
1、简介
Replication Controller是Kubernetes系统中的核心概念,用于定义Pod副本的数量。
在Master内,Controller Manager进程通过RC的定义来完成Pod的创建、监控、启停等操作。
根据Replication Controller的定义,Kubernetes能够确保在任意时刻都能运行用于指定的Pod“副本”(Replica)数量。
如果有过多的Pod副本在运行,系统就会停掉一些Pod;
如果运行的Pod副本数量太少,系统就会再启动一些Pod,
总之,通过RC的定义,Kubernetes总是保证集群中运行着用户期望的副本数量。
同时,Kubernetes会对全部运行的Pod进行监控和管理,如果有需要(例如某个Pod停止运行),就会将Pod重启命令提交给Node上的某个程序来完成(如Kubelet或Docker)。
通过对Replication Controller的使用,Kubernetes实现了应用集群的高可用性,并大大减少了系统管理员在传统IT环境中需要完成的许多手工运维工作(如主机监控脚本、应用监控脚本、故障恢复脚本等)。
2、rc资源定义
在配置文件中通过spec.template定义Pod的属性(这部分定义与Pod的定义是一致的),设置spec.replicas=5来定义Pod副本的数量。vim k8s_rc.yml
apiVersion: v1
kind: ReplicationController #资源类型
metadata: #属性
name: web-nginx
spec:
replicas: 5 #副本数量
selector: #RC通过spec.selector来筛选标签要控制的Pod
app: nginx
template:
metadata:
labels: #Pod的标签
app: nginx
spec:
containers:
- name: web-nginx
image: 172.1.1.12:5000/nginx:v1
ports:
- containerPort: 80
3、创建rc
kubectl create -f k8s_rc.yml
查看结果即可看到5个pod都在运行
4、测试rc高可用功能
1⃣️、先删除一个pod,然后再查看即可看到会再滋生出一个新pod
2⃣️、模拟一node节点宕机,然后查看pod,发现所有pod会自动转移到正常接node节点上
删除172.1.1.13后只剩下172.1.1.14节点,原13上的pod也全部转移在14上
5、滚动升级
新建一个rc.yml
metadata:
name: web-nginx-2
spec:
replicas: 5
selector:
app: nginx-2
template:
metadata:
labels:
app: nginx-2 #定义一个与上一rc不同标签
spec:
containers:
- name: web-nginx-2
image: 172.1.1.12:5000/nginx:v2 #镜像修改为了v2
ports:
- containerPort: 80
升级
kubectl rolling-update web-nginx -f k8s_rc_2.yml --update-period=10s
升级过程
当web-nginx-2存活超过10s就会关闭一个web-nginx,开启一个web-nginx-2
6、回滚
原理和滚动升级一样
kubectl rolling-update web-nginx-2 -f k8s_rc.yml --update-period=10s
三、Service资源
1、简介
Service资源是为动态管理的Pod对象添加一个固定访问入口。
service和pod之间是通过Label串起来,相同的Service的pod的Label是一样的.同一个service下的所有pod是通过kube-proxy实现负载均衡.而每个service都会分配一个全局唯一的虚拟ip,也就cluster ip.
service默认使用iptables来实现负载均衡, k8s 1.8新版本中推荐使用lvs(四层负载均衡)
在该service整个生命周期内,cluster ip保持不变,而在kubernetes中还有一个dns服务,它会把service的name解析为cluster ip。
2、service资源定义
vim k8s_svc.yml
apiVersion: v1
kind: Service
metadata:
name: my-web
spec:
type: NodePort #ClusterIP
ports:
- port: 80 #cluster IP port
nodePort: 30000 #node port
targetPort: 80 #pod port
selector:
app: nginx #pod标签
3、创建svc查看结果
创建svc
kubectl create -f k8s_svc.yml
查看svc资源
kubectl get svc

查看svc详细信息
kubectl describe svc my-web

如果Endpoints一行为空,则要排查svc资源定义的标签是否可需要相串的pod标签一致
4、修改nodePort端口范围
vim /etc/kubernetes/apiserver
KUBE_API_ARGS="--service-node-port-range=5000-50000"
cluster IP范围可修改以下内容
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
四、Deployment资源
1、简介
RC在滚动升级之后,会造成服务访问中断,于是k8s引入了Deployment资源。
Deployment是新一代用于Pod管理的对象,与Replication Controller相比,它提供了更加完善的功能,使用起来更加简单方便。
2、deployment资源定义
vim k8s_deploy.yml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-deployment #Pod名称
spec:
replicas: 3 #副本数量
template:
metadata:
labels:
app: nginx #Pod标签
spec:
containers:
- name: nginx #容器名称
image: 172.1.1.12:5000/nginx:v1
ports:
- containerPort: 80
3、创建deploy资源
1)根据配置文件进行创建
kubectl create -f k8s_deploy.yml
2)命令行创建
kubectl run nginx-test --image=172.1.1.12:5000/nginx:v1 --replicas=2 --record
4、滚动升级
kubectl set image deploy nginx-test nginx-test=172.1.1.12:5000/nginx:v2
5、回滚
查看历史版本
kubectl rollout history deployment nginx-test
回滚至上一个版本
kubectl rollout undo deployment nginx-test

回滚指定版本
kubectl rollout undo deployment nginx-test --to-revision=2

