kubernetes核心资源管理

1.pod的使用

mkdir /opt/yml  -p 
cd /opt/yml
[root@k8s-master yaml]# cat nginx.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: default
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    imagePullPolicy: IfNotPresent
    ports:
        - containerPort: 80
  restartPolicy: Always
kubectl create -f nginx.yaml 创建
kubectl get nodes --show-labels 查看node的标签
kubectl get pod 查看
kubectl get pod -o wide 查看详细信息
kubectl get namespace 查看命名空间
kubectl get pods -o wide -l app=nginx 只查看需要的信息
kubectl descrie pods  查看pod的具体信息 排错
kubectl delete pod nginx  删除
kubectl logs nginx  查看日志
kubectl exec -it  nginx /bin/sh 进入容器
kubectl exec -it pod-demo -c myapp -- /bin/sh  进入pod-demo中myapp容器中
通过pod ip 访问 curl 10.244.1.7 
vim nginx.yaml  
 image: ikubernetes/myapp:v2
kubectl replace  --force -f k8s_pod.yml 升级 先删除旧的 再新建新的
图片.png

1.1 pod 共享网络 存储

共享网络:
一个 Pod 可以有多个容器,彼此间共享网络和存储资源,每个 Pod 中有一个 Pause 容器保存所有的容器状态, 通过管理 pause 容器,达到管理 pod 中所有容器的效果
一个pod中所有容器都加入pause中 达到一个命名空间 共享网络
共享存储:
引入共享数据卷持久化存储文件

1.2 pod image 拉取方式

 imagesPullPolicy: IfNotPresent |  Always | Never
Always 总是拉取镜像
IfNotPresent 本地有则使用本地镜像,不拉取  
Never 只使用本地镜像,从不拉取,即使本地没有
如果省略imagePullPolicy  策略为IfNotPresent 

1.3 pod 资源限制

https://kubernetes.io/docs/tasks/configure-pod-container/assign-cpu-resource/
resources:
      limits:   最大
        cpu: "250m"
        memory: 2048Mi
      requests:  最小
        cpu: "128m"
        memory: 1024Mi
1核=1000m
250m=0.25核

1.4 pod重启机制

restartPolicy: [Always|Never|OnFailure]//重启策略,默认值为 Always
Always 不停重启
Never 从不重启    批量任务 或者 任务计划中
OnFailure 退出状态码非0的时候 才重启

1.5 pod 健康检查

livenessProbe 存活检查 如果检查失败 将杀死容器 根据pod的重启策略操作
readinessProbe 就绪检查 如果检查失败 k8s将pod从service endpoint中剔除
检查方法:
 ExecAction,在容器中执行特定的命令,命令退出返回0表示成功
 TCPSocketAction,根据容器IP地址及特定的端口进行TCP检查,端口开放表示成功
 HTTPGetAction,根据容器IP、端口及访问路径发起一次HTTP请求,如果返回码在200到400之间表示成功
每种检查动作都可能有三种返回状态。
Success,表示通过了健康检查
Failure,表示没有通过健康检查
Unknown,表示检查动作失败

1.5.1 livenessProbe 存活检查 exec

[root@k8s-master yaml]# vim livenessProbe.yaml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    app: liveness-exec
  name: liveness-exec
spec:
  containers:
  - name: liveness-exec
    image: busybox:latest
    imagePullPolicy: IfNotPresent
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 20; rm -rf /tmp/healthy; sleep 600
    livenessProbe:
      exec:
        command:
        - test
        - -c
        - /tmp/healthy
容器会不停的重启 满足条件

1.5.2 HTTP Health Check

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: httpget
  name: liveness-httpget
spec:
  containers:
  - name: liveness-httpget
    image: nginx:1.12-alpine
    ports:
    - name: http
      containerPort: 80
    lifecycle: 
      postStart:     pod启动后
        exec:
          command:
          - /bin/sh
          - -c
          - 'echo healthy > /usr/share/nginx/html/healthz '
    livenessProbe:     生命探测  
      httpGet:
        path: /healthz
        port: http
        scheme: HTTP
      periodSeconds: 2   每2分钟探测一次
      failureThreshold: 2   每2分钟 失败探测
      initialDelaySeconds: 3  pod启动后延迟3分钟探测

1.5.3 TCP Socket

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
    app: node
  name: liveness-tcp
spec:
  containers:
  - name: goproxy
    image: docker.io/googlecontainer/goproxy:0.1
    ports:
    - containerPort: 8080
    readinessProbe:
      tcpSocket:
        port: 8080
      initialDelaySeconds: 5
      periodSeconds: 10
    livenessProbe:
      tcpSocket:
        port: 8080
      initialDelaySeconds: 15
      periodSeconds: 20

1.6 pod调度

1. pod 资源限制 request
2. pod的节点选择器 nodeSelector调度  条件不满足无法调度
kubectl get nodes --show-labels 查看node中标签  
kubectl label node k8s-node1 env_role=dev  手动添加标签
3.节点亲和性  
         硬亲和性 必须满足 等待状态 无法调度
         软亲和性条件有调度条件没有 也能调度
        In Notin 

1.6.1 label节点选择

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: default
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    imagePullPolicy: IfNotPresent        
    ports:
        - containerPort: 80
  restartPolicy: Always
  nodeSelector:
    kubernetes.io/hostname: k8s-node1

1.6.2 硬亲和

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: default
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    imagePullPolicy: IfNotPresent
    ports:
        - containerPort: 80
  restartPolicy: Always
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/hostname
            operator: In
            values:
            - k8s-node2

1.6.3 软亲和

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: default
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    imagePullPolicy: IfNotPresent
    ports:
        - containerPort: 80
  restartPolicy: Always
  affinity:
    nodeAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: kubernetes.io/hostname
            operator: In
            values:
            - k8s-node1

1.8 pod污点

污点(taints) node节点属性 
[root@k8s-master yaml]# kubectl describe node k8s-master |grep Taint 查看污点
Taints:             node-role.kubernetes.io/master:NoSchedule
污点值:
NoSchedule 这个节点一定不被调度
PreferNoSchedule 尽量不被调度
NoExecute 不会调度并且会驱逐Node中已有的pod
kubectl taint node k8s-node1 env_role=yes:NoSchedule  (env_role=yes 名称可以随意)
kubectl create deployment web --image=nginx
kubectl scale deployment web --replicas=5 发现pod 都在node2上
kubectl taint node k8s-node1 env_role:NoSchedule- 清除污点
容忍(tolerations)
$ kubectl taint nodes node01 key=value:NoSchedule
kubectl taint node k8s-node1 env_role=yes:NoSchedule
    tolerations:
    - key: "key" 填写env_role
      operator: "Equal"
      value: "value"  填写yes
      effect: "NoScheduale"
调度master 中
tolerations:
- key: "node-role.kubernetes.io/master"
  operator: "Exists"
  effect: "NoSchedule"

2. Controller

pod 是通过controller实现应用的运维 如伸缩 滚动升级等等
pod 域controller 之间通过label标签建立关系 

2.1 deployment deploy

部署无状态应用
管理pod 和ReplicaSet
部署、滚动升级等功能
应用场景 web服务 微服务
kubectl create deployment web --image=nginx --dry-run=client -o yaml >web.yaml 导出
kubectl apply -f web.yaml 应用
kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name web -o yaml >service.yaml 对外暴露端口
kubectl apply -f service.yaml 应用
kubectl edit deployment web 在线修改里面配置
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:   关联
    app: web
  name: web
spec:
  replicas: 3
  selector:
    matchLabels:   关联
      app: web
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: web
    spec:
      containers:
      - image: nginx
        name: nginx
        resources: {}
status: {}
deployment 更新回滚
kubectl create deployment wangye --image=ikubernetes/myapp:v1 创建
kubectl set image deployment wangye myapp=ikubernetes/myapp:v2 更新版本
kubectl rollout status deployment wangye 查看升级状态
kubectl rollout histort deployment wangye 查看升级的历史
kubectl rollout undo deployment wangye 回滚到上一个版本
kubectl rollout undo deployment wangye --to-revision=2 回滚到指定版本
kubectl scale deployment wangye --replicas=10 弹性伸缩

2.2 service srv

1.防止 pod失联
2.服务发现 负载均衡 根据标签关联
kubectl expose --help
ClusterIP 集群内部访问 默认设置
NodePort 对外访问应用使用 
LoadBalancer 对外访问应用使用 公有云
访问:web.default.svc.cluster.local pod会解析到svc中的ip

2.2.1 NodePort

创建一个nodePort类型的service,让节点外主机可以访问到服务.
vim  myapp-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: myapp
  namespace: default
spec:
  selector:
    app: myapp
    release: canary
  clusterIP: 10.99.99.99  #此地址设定为固定很容易冲突, 建议最好不写,让其自动分配.
  type: NodePort
  ports:
  - port: 80          #设置Service对外提供服务的端口
    targetPort: 80    # 设置Pod对外提供服务的端口.
    protocol: TCP  #端口类型
    nodePort: 30080   #可以自己指定端口 前提不冲突

2.2.2 ClusterIP

[root@k8s-master ~]# cat myapp-svc1.yaml 
apiVersion: v1
kind: Service
metadata:
  name: myapp1
  namespace: default
spec:
  selector:
    app: myapp1
  clusterIP: 10.99.99.98  #此地址设定为固定很容易冲突, 建议最好不写,让其自动分配.
  type: ClusterIP
  ports:
  - port: 80          #设置Service对外提供服务的端口
    targetPort: 80    # 设置Pod对外提供服务的端口.
    protocol: TCP  #端口类型

2.2.3 HeadLiness 类型

[root@k8s-master ~]# cat myapp-svc2.yaml 
apiVersion: v1
kind: Service
metadata:
  name: myapp2
  namespace: default
spec:
  selector:
    app: myapp2
  clusterIP: None  #跟ClusterIP唯一区别在此处 node
  type: ClusterIP
  ports:
  - port: 80          #设置Service对外提供服务的端口
    targetPort: 80    # 设置Pod对外提供服务的端口.
    protocol: TCP  #端口类型
[root@k8s-master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
blog-mysql   ClusterIP   10.110.225.176   <none>        3306/TCP       73m
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        3d19h
myapp        NodePort    10.99.99.99      <none>        80:30080/TCP   9m24s
myapp1       ClusterIP   10.99.99.98      <none>        80/TCP         3m54s
myapp2       ClusterIP   None             <none>        80/TCP         13s

kubectl exec -it nginx-f857964c8-fw2w4 -- /bin/bash 进入任意pod中查看
root@nginx-f857964c8-fw2w4:/# cat /etc/resolv.conf 
nameserver 10.96.0.10 DNS解析
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
[root@k8s-master ~]# kubectl get svc -n kube-system
NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
kube-dns   ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   3d19h
dig @10.96.0.10 php.default.svc.cluster.local  解析域名访问

2.2.4 HeadLiness 类型 将外部服务映射到pod中

[root@k8s-master ~]# cat myapp-svc3.yaml 
apiVersion: v1
kind: Service
metadata:
  name: myapp3
  namespace: default
spec:
  type: ExternalName
  externalName: www.baidu.com
测试解析:
 dig @10.96.0.10 myapp3.default.svc.cluster.local
kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name web --dry-run=client -o yaml >service.yaml
[root@k8s-master yaml]# cat service.yaml 
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: web
  name: web
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: web
  type: NodePort
status:
  loadBalancer: {}

2.3 有状态statefulset

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx

---

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: nginx-statefulset
  namespace: default
spec:
  serviceName: nginx
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
kubectl get pods -o wide 名称唯一不重复
nginx-statefulset-0   1/1     Running   0          82s   10.244.2.5   k8s-node2   <none>           <none>
nginx-statefulset-1   1/1     Running   0          20s   10.244.1.4   k8s-node1   <none>           <none>
nginx-statefulset-2   1/1     Running   0          10s   10.244.2.6   k8s-node2   <none>           <none>
[root@k8s-master yaml]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        36h
nginx        ClusterIP   None            <none>        80/TCP         3m13s
web          NodePort    10.106.212.87   <none>        80:31624/TCP   35h
访问:nginx-statefulset-0.nginx.default.svc.cluster.local 
主机名称.service名称.命名空间默认default.svc.cluster.local
kubectl exec -it web-5fddd679d-c2vmg -- /bin/sh
/ # ping nginx-statefulset-0.nginx.default.svc.cluster.local
PING nginx-statefulset-0.nginx.default.svc.cluster.local (10.244.2.5): 56 data bytes
64 bytes from 10.244.2.5: seq=0 ttl=62 time=0.950 ms
64 bytes from 10.244.2.5: seq=1 ttl=62 time=1.007 ms

2.4 daemonset 部署守护进程

在每个node上运行一个pod 新加入的node也同样运行在一个pod里面  如容器监控工具
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: ds-test 
  labels:
    app: filebeat
spec:
  selector:
    matchLabels:
      app: filebeat
  template:
    metadata:
      labels:
        app: filebeat
    spec:
      containers:
      - name: logs
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - name: varlog
          mountPath: /tmp/log
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
kubectl apply -f daemonset.yaml 
[root@k8s-master yaml]# kubectl get daemonset
NAME      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
ds-test   2         2         2       2            2           <none>          28s
kubectl exec -it ds-test-6rhwg -- /bin/bash 
root@ds-test-6rhwg:~# ls /tmp/log/  查看当前的宿主机中的日志
anaconda       chrony     dmesg           maillog        messages-20210124  secure        spooler-20210124
audit          containers     dmesg.old       maillog-20210123   pods           secure-20210123   tallylog

2.5 job 一次性任务

求取圆周率
apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4
kubectl get jobs 查看 完成后显示 Completed
[root@k8s-master yaml]# kubectl logs pi-pdlz9   查看计算的圆周率
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275901

2.6 crontab 周期性任务

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure
[root@k8s-master yaml]# kubectl get cronjob
NAME    SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
hello   */1 * * * *   False     0        <none>          26s
[root@k8s-master yaml]# kubectl logs hello-1611540300-m64qs
Mon Jan 25 02:05:16 UTC 2021
Hello from the Kubernetes cluster
[root@k8s-master yaml]# kubectl get pods
NAME                     READY   STATUS      RESTARTS   AGE
hello-1611540300-m64qs   0/1     Completed   0          2m35s
hello-1611540360-ghb97   0/1     Completed   0          93s
hello-1611540420-6ndkb   0/1     Completed   0          33s

2.7 secret 传递变量 加密

[root@k8s-master yaml]# echo -n "admin" |base64  base64编码
YWRtaW4=
vim secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: YWRtaW4=
  password: MWYyZDFlMmU2N2Rm
 kubectl apply -f secret.yaml 
使用secret 存储dockerhub账户密码 拉取镜像
kubectl create secret docker-registry secret名字 \
  --docker-server=<你的镜像仓库服务器> \
  --docker-username=<你的用户名> \
  --docker-password=<你的密码> \
  --docker-email=<你的邮箱地址>
ilinux@k8s-master:~$ vim dockerhub.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: private-yickshun-ssr
spec:
  containers:
  - name: private-yickshun-ssr
    image: onlinemy/yickshun-ssr:latest
  imagePullSecrets:
  - name: secret名字

2.7.1 以变量的方式挂载

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: nginx
    image: nginx
    env:
      - name: SECRET_USERNAME
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: username
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: password
kubectl apply -f env.yaml
kubectl exec -it mypod -- /bin/bash
root@mypod:/# echo $SECRET_USERNAME
admin
root@mypod:/# echo $SECRET_PASSWORD
1f2d1e2e67df

2.7.2 以文件的方式挂载

apiVersion: v1
kind: Pod
metadata:
  name: myfile
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
      readOnly: true
  volumes:
  - name: foo
    secret:
      secretName: mysecret
kubectl apply -f file.yaml
kubectl exec -it myfile -- /bin/bash
root@myfile:~# ls /etc/foo/
password  username
root@myfile:~# cat /etc/foo/password 
1f2d1e2e67df
root@myfile:~# cat /etc/foo/username 
admin

2.8 configmap cm 配置文件

vim redis.conf
redis.host=127.0.0.1
redis.port=6379
redis.password=123456
kubectl create configmap redis-config --from-file=redis.conf 
[root@k8s-master yaml]# kubectl get cm
NAME           DATA   AGE
redis-config   1      36s
[root@k8s-master yaml]# kubectl describe cm redis-config 查看具体的详细信息

2.8.1 以文件 数据卷形式挂载

apiVersion: v1
kind: Pod
metadata:
  name: myconfig
spec:
  containers:
    - name: busybox
      image: busybox
      command: [ "/bin/sh","-c","cat /etc/config/redis.conf" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: redis-config
  restartPolicy: Never
[root@k8s-master yaml]# kubectl logs myconfig
redis.host=127.0.0.1
redis.port=6379
redis.password=123456

2.8.2 以变量形式挂载

[root@k8s-master yaml]# vim cmenv.yaml  创建变量
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfig
  namespace: default
data:
  special.level: info
  special.type: hello
[root@k8s-master yaml]# vim cmenv-config.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: mypodenv
spec:
  containers:
    - name: busybox
      image: busybox
      command: [ "/bin/sh", "-c", "echo $(LEVEL) $(TYPE)" ]
      env:
        - name: LEVEL
          valueFrom:
            configMapKeyRef:
              name: myconfig
              key: special.level
        - name: TYPE
          valueFrom:
            configMapKeyRef:
              name: myconfig
              key: special.type
  restartPolicy: Never
[root@k8s-master yaml]# kubectl logs mypodenv
info hello

3. ingress 实现不同域名访问不同的sevice nginx反向代理

https://github.com/kubernetes/ingress-nginx/blob/master/docs/deploy/index.md

3.1 部署 service 服务

kubectl create deployment web --image=nginx
kubectl expose deployment web --port=80 --target-port=80 --type=NodePort

3.2 部署 ingress-controller

mkdir ingress-controller
cd  ingress-controller
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml
vim mandatory.yaml
将里面的quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0
修改成  registry.aliyuncs.com/google_containers/nginx-ingress-controller:0.30.0
kubectl apply -f mandatory.yaml
kubectl apply -f service-nodeport.yaml
kubectl get namespace
kubectl get pods -n ingress-nginx
[root@k8s-master ~]# kubectl get svc -n ingress-nginx 
NAME            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx   NodePort   10.104.19.64   <none>        80:30270/TCP,443:31119/TCP   99s
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: example-ingress
spec:
  rules:
  - host: example.ingredemo.com
    http:
      paths:
      - path: /
        backend:
          serviceName: web
          servicePort: 80
kubectl apply -f ingress-web.yaml
vim /etc/hosts
192.168.199.101 example.ingredemo.com
[root@localhost ~]# curl example.ingredemo.com:30270
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

4. Helm

https://github.com/helm/helm/releases

wget https://get.helm.sh/helm-v3.5.0-linux-amd64.tar.gz
tar xf helm-v3.5.0-linux-amd64.tar.gz 
cd linux-amd64/
mv helm /usr/bin/
添加仓库
helm repo add stable http://mirror.azure.cn/kubernetes/charts
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
helm repo update
helm repo list
helm repo remove aliyun 移除仓库
helm search repo waeve 搜索资源
helm install ui stable/weave-scope 安装资源
helm create mychart  自定义chart
Creating mychart
 tree mychart/
mychart/
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── ingress.yaml
│ ├── NOTES.txt
│ └── service.yaml
└── values.yaml
 Chart.yaml:用于描述这个 Chart 的基本信息,包括名字、描述信息以及版本等。
 values.yaml :用于存储 templates 目录中模板文件中用到变量的值。
 Templates: 目录里面存放所有 yaml 模板文件。
 charts:目录里存放这个 chart 依赖的所有子 chart。
 NOTES.txt :用于介绍 Chart 帮助信息, helm install 部署后展示给用户。例如:如何使用这个 Chart、列出缺省的设置等。
_helpers.tpl:放置模板助手的地方,可以在整个 chart 中重复使用

5. 部署dashboard

wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml
vim recommended.yaml
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  type: NodePort  #增加
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30009 #增加
kubectl apply -f recommended.yaml
kubectl get namespace 查看新建命名空间
[root@k8s-master ~]# kubectl get pods -n kubernetes-dashboard -o wide
NAME                                         READY   STATUS              RESTARTS   AGE   IP       NODE         NOMINATED NODE   READINESS GATES
dashboard-metrics-scraper-6b4884c9d5-2dfsq   0/1     ContainerCreating   0          7s    <none>   k8s-master   <none>           <none>
kubernetes-dashboard-7b544877d5-wfggg        0/1     ContainerCreating   0          9s    <none>   k8s-master   <none>           <none>
[root@k8s-master ~]# kubectl get svc -n kubernetes-dashboard -o wide
NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE   SELECTOR
dashboard-metrics-scraper   ClusterIP   10.100.206.239   <none>        8000/TCP        17s   k8s-app=dashboard-metrics-scraper
kubernetes-dashboard        NodePort    10.109.103.129   <none>        443:30009/TCP   19s   k8s-app=kubernetes-dashboard

http://192.168.199.100:30009 默认运行在master节点上
创建访问账户 获取token
[root@k8s-master ~]# kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard
serviceaccount/dashboard-admin created
[root@k8s-master ~]# kubectl create clusterrolebinding dashboard-admin-rb --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin
clusterrolebinding.rbac.authorization.k8s.io/dashboard-admin-rb created
[root@k8s-master ~]# kubectl describe secrets kubernetes-dashboard-token-pnbhs -n kubernetes-dashboard 粘贴就好了
eyJhbGciOiJSUzI1NiIsImtpZCI6ImRlOTZiSVRYb3BfbnhDcm9rcFBuS0dHT2M5MjVsWEZpRFJuWjVtSXJjNkUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZC10b2tlbi1wbmJocyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjQyMDc5YzIxLTRlYjgtNDU5YS05MzkzLTliYThmZjZiMTEwMiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDprdWJlcm5ldGVzLWRhc2hib2FyZCJ9.LDC2DCUinfO0Cow_40Pzv71SkpSvnKtvm95iqxMc26309FoRpZUsyzq8eV5UW4S7nYmlIrNQ7KVpHpMzGrkbX6x2yh_cz4VgtnhXqDRhv2YjMgKUToZpNyH4AF7zLE-r5XPEVi1uUFhwiNC5ENvrZu546ORMxr8AGa2jmybdev-lzLXCsY9eCCtbX4PHktvYEL3hhE8vQLFG4DdjG3SOieh26CEVw_hf7pdB1M2ImjPJTY7p2VMhwbfyC-dNypL23dC51DJs7GODlUEqpmnCgaeBFy4Hjz438aBCXqNpnh66GG-1Zy5RWba50HWWEBYiDVZgLAq412eW1oQii_HvqQ

6.动态pv

https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner

#配置nfs
apt install nfs-kernel-server #服务端
mkdir /nfs/data -p
echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports
systemctl restart nfs-server

apt install nfs-common #客户端
showmount -e 10.0.0.10
mkdir /nfs/data -p
mount.nfs 10.0.0.10:/nfs/data /nfs/data
wget https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner/archive/refs/tags/nfs-subdir-external-provisioner-4.0.14.tar.gz
tar xf nfs-subdir-external-provisioner-4.0.14.tar.gz
cd nfs-subdir-external-provisioner-4.0.14/deploy
vim deploy.yaml
修改里面的nfs的ip地址 跟nfs路径
kubectl apply -f class.yaml -f rbac.yaml -f deployment.yaml
kubectl apply -f test-claim.yaml
kubectl delet -f test-pod.yaml
#文件中如果有SUCCESS 说明成功
root@k8s-master:~# ll /nfs/data/default-test-claim-pvc-e09cdd52-3cb8-42d7-989c-ba5befa0d67a/
total 8
drwxrwxrwx 2 root root 4096 Oct  9 09:41 ./
drwxrwxrwx 4 root root 4096 Oct  9 09:40 ../
-rw-r--r-- 1 root root    0 Oct  9 09:41 SUCCESS

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容