一、Pod资源

1、Pod简介

Pod是Kubernetes调度的最小单元。一个Pod可以包含一个或多个容器,因此它可以被看作是内部容器的逻辑宿主机。

2、k8s yml主要组成

  1. apiVersion: v1 #api版本
  2. kind: pod #资源类型
  3. metadata: #属性
  4. 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

image.png
可以看到已经处于容器创建状态13分钟了,并且没有ip地址分配,那么就是有问题的

5、报错处理

先查看资源详细信息

kubectl describe pod nginx

image.png
查看报错发现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 信息
image.png查看pod发现已经处于running中了
image.png

二、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都在运行
image.png

4、测试rc高可用功能

1⃣️、先删除一个pod,然后再查看即可看到会再滋生出一个新pod
image.png
2⃣️、模拟一node节点宕机,然后查看pod,发现所有pod会自动转移到正常接node节点上
image.png
删除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
image.png

6、回滚

原理和滚动升级一样

kubectl rolling-update web-nginx-2 -f k8s_rc.yml --update-period=10s

image.png

三、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

image.png
查看svc详细信息

kubectl describe svc my-web

image.png
如果Endpoints一行为空,则要排查svc资源定义的标签是否可需要相串的pod标签一致

浏览器访问nodeIP+端口查看
image.png

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

image.png

2)命令行创建

kubectl run nginx-test  --image=172.1.1.12:5000/nginx:v1  --replicas=2 --record

image.png

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

image.png
回滚指定版本

kubectl rollout undo deployment nginx-test --to-revision=2

image.png