一.namespace

 

命名空间用来做资源隔离,常运用于环境的区分,如dev,test,prod

创建命名空间
kubectl create ns hello

删除命名空间
kubectl delete ns hello

查询所有命名空间:kubectl get namespace

k8s namespace 限定节点 k8s指定命名空间_k8s namespace 限定节点

还有另外一种方式是通过yaml来创建

ymal文件内容:

apiVersion: v1
kind: Namespace
metadata:
  name: hello

通过kubectl apply -f xxxx.yaml 运行ymal文件来创建命名空间

二.Pod

pod是k8s运行的最小单元,里面可以包含多个容器。

1.通过命令行创建:

创建一个nginx镜像
kubectl run mynginx --image=nginx
查看运行日志
kubectl logs pod mynginx
# 删除pod
kubectl delete pod mynginx
查看nginx启动描述
kubectl describe pod mynginx
查看默认命名空间下pod的ip
kubectl get pod -owide

k8s namespace 限定节点 k8s指定命名空间_docker_02

2.通过命令创建

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: mynginx
  name: mynginx
#  namespace: default
spec:
  containers:
  - image: nginx
    name: mynginx

三.Deployment 

控制pod,使pod拥有自愈与故障转移,多副本,扩缩容,滚动更新,版本回退的能力。 

1.自愈与故障转移

#创建镜像的deployment
kubectl create deployment  mynginx --image=nginx
#获取deployment
kubectl get deployment
#删除deployment
kubectl delete deployment  mynginx

k8s namespace 限定节点 k8s指定命名空间_kubernetes_03

 它与pod的最大的不同是当我们删除pod的时候k8s还会再次启动一个pod,这就是deployment的自愈能力。

2.多副本

#创建3个副本
kubectl create deployment mynginx --image=nginx --replicas=3

k8s namespace 限定节点 k8s指定命名空间_容器_04

3.扩缩容

kubectl scale --replicas=5 deployment/mynginx

k8s namespace 限定节点 k8s指定命名空间_k8s namespace 限定节点_05

 4.滚动更新

滚动更新相当于就是先启动新版本,当新版本启动成功后再停止旧版本。

 更新前:

k8s namespace 限定节点 k8s指定命名空间_docker_06

kubectl set image deployment/mynginx nginx=nginx:1.16.1 --record

更新后:

k8s namespace 限定节点 k8s指定命名空间_kubernetes_07

 5. 版本回退

#历史记录
kubectl rollout history deployment/mynginx
#查看某个历史详情
kubectl rollout history deployment/mynginx --revision=2
#回滚(回到上次)
kubectl rollout undo deployment/mynginx
#回滚(回到指定版本)
kubectl rollout undo deployment/mynginx --to-revision=2

四.Service 

一组相同的pod暴露统一的端口和ip,供其它应用访问。

1.ClusterIp

这种服务只能在集群内访问

流程图如下:

k8s namespace 限定节点 k8s指定命名空间_docker_08

# 等同于没有--type的
kubectl expose deployment mynginx --port=8000 --target-port=80 --type=ClusterIP
# 删除service
kubectl delete service mynginx

运行效果:

k8s namespace 限定节点 k8s指定命名空间_docker_09

 2.NodePort

使节点端口暴露在公网上能被外部访问,节点开放的端口范围在 30000-32767 之间

kubectl expose deployment mynginx --port=8000 --target-port=80 --type=NodePort

运行效果:

k8s namespace 限定节点 k8s指定命名空间_nginx_10

 可以看到暴露到公网的端口号为32602,在浏览器中输入公网ip+端口即可访问到nginx

 五.Ingress

可以理解为网关,所有请求都先请求ingress,然后再路由到service,以nginx实现。

#下载yaml
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.47.0/deploy/static/provider/baremetal/deploy.yaml
vi deploy.yaml
#将containers:- name: controller的image的值改为如下值:
registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/ingress-nginx-controller:v0.46.0

查看创建结果:

k8s namespace 限定节点 k8s指定命名空间_k8s namespace 限定节点_11

k8s namespace 限定节点 k8s指定命名空间_nginx_12

 上面暴露了两个端口32678为http端口,30065为https端口

六.抽象存储

抽象存储,可以理解为k8s为pod容器中的配置或持久化数据所做的一层共享存储,它相当于是把容器内部的配置或者数据文件映射到外部的虚拟机上,这样当一个节点挂了,k8s的故障转移特性,会在另外一个节点上启动pod,这时候这个pod的配置就会从这个共享的文件目录中去加载启动。

下面会列出nfs(网络文件系统)的安装:

1.安装nfs

#所有node安装
yum install -y nfs-utils

2.主节点

#暴露目录
echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports

mkdir -p /nfs/data

systemctl enable rpcbind --now
systemctl enable nfs-server --now

#配置生效
exportfs -r

#检测暴露目录
exportfs

查看暴露目录: 

k8s namespace 限定节点 k8s指定命名空间_k8s namespace 限定节点_13

3.从节点

#让从节点同步主节点的目录
showmount -e 172.31.0.4
#执行以下命令挂载 nfs 服务器上的共享目录到本机路径
mkdir -p /nfs/data
#挂载目录
mount -t nfs 172.31.0.4:/nfs/data /nfs/data

k8s namespace 限定节点 k8s指定命名空间_k8s namespace 限定节点_14

主节点执行: 

# 写入一个测试文件
echo "hello nfs server" > /nfs/data/test.txt

从节点查看:

k8s namespace 限定节点 k8s指定命名空间_k8s namespace 限定节点_15

4.数据存储挂载

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-pv-demo
  name: nginx-pv-demo
spec:
  replicas: 2 # 副本数有两个
  selector:
    matchLabels:
      app: nginx-pv-demo
  template:
    metadata:
      labels:
        app: nginx-pv-demo
    spec:
      containers:
      - image: nginx # 拉取一个nginx镜像
        name: nginx
        volumeMounts: # 定义要挂载的目录
        - name: html
          mountPath: /usr/share/nginx/html
      volumes:
        - name: html #这个对应上面要挂载的目录的名称
          nfs: #使用nfs方式
            server: 172.31.0.4 #nfs主节点的ip地址
            path: /nfs/data/nginx-pv #挂载到主机的这个目录下

下面可以创建测试文件

k8s namespace 限定节点 k8s指定命名空间_docker_16

直接进入容器查看:

k8s namespace 限定节点 k8s指定命名空间_kubernetes_17

 但是以上方式并不能设置挂载的空间大小,下面介绍另外一种方式pv和pvc

pv:持久卷(persistent volume),将应用需要持久化的数据保存到指定位置

pvc:持久卷申明(persistent volume claim),申明需要使用持久卷的大小

1.创建静态pv池

#nfs主节点
mkdir -p /nfs/data/01
mkdir -p /nfs/data/02
mkdir -p /nfs/data/03

2.创建pv

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv01-10m
spec:
  capacity:
    storage: 10M
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  nfs:
    path: /nfs/data/01
    server: 172.31.0.4
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv02-1gi
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  nfs:
    path: /nfs/data/02
    server: 172.31.0.4
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv03-3gi
spec:
  capacity:
    storage: 3Gi
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  nfs:
    path: /nfs/data/03
    server: 172.31.0.4

k8s namespace 限定节点 k8s指定命名空间_kubernetes_18

 3.创建pvc与pv绑定

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nginx-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 200Mi
  storageClassName: nfs

k8s namespace 限定节点 k8s指定命名空间_k8s namespace 限定节点_19

 4.创建pvc与pod绑定

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-deploy-pvc
  name: nginx-deploy-pvc
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-deploy-pvc
  template:
    metadata:
      labels:
        app: nginx-deploy-pvc
    spec:
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html
      volumes:
        - name: html
          persistentVolumeClaim:
            claimName: nginx-pvc