kubenetes(k8s)學習筆記

kubernetes(K8S)       google     html

特色:node

一、輕量級:消耗資源小linux

二、開源nginx

三、彈性伸縮git

四、負載均衡github


高可用集羣副本數據最好是 >= 3 奇數個web


組件說明:docker

主要組件:數據庫

APISERVER:全部服務訪問的統一入口json

CrontrollerManager:維持副本指望數目

Scheduler::負責介紹任務,選擇合適的節點進行分配任務

ETCD:鍵值對數據庫  儲存K8S集羣全部重要信息(持久化)

Kubelet:直接跟容器引擎交互實現容器的生命週期管理

Kube-proxy:負責寫入規則至 IPTABLES、IPVS 實現服務映射訪問的

其餘插件說明:

COREDNS:能夠爲集羣中的SVC建立一個域名IP的對應關係解析

DASHBOARD:給 K8S 集羣提供一個 B/S 結構訪問體系

INGRESS CONTROLLER:官方只能實現四層代理,INGRESS 能夠實現七層代理

FEDERATION:提供一個能夠跨集羣中心多K8S統一管理功能

PROMETHEUS:提供K8S集羣的監控能力

ELK:提供 K8S 集羣日誌統一分析接入平臺







k8s安裝部署:

各節點系統初始化:此處環境爲

k8s-master01    172.20.120.187

k8s-node01       172.20.120.184

k8s-node02       172.20.120.183

harbor               172.20.120.182




一、設置主機名、主機名ip解析

# hostnamectl set-hostname k8s-node01

# vi /etc/hosts

172.20.120.187  k8s-master01

172.20.120.184  k8s-node01

172.20.120.183  k8s-node02

172.20.120.182  hub.nice.com


二、安裝依賴包

# yum install epel-release -y

# yum install conntrack ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git -y


三、設置防火牆爲iptables,並清空規則

# systemctl stop firewalld && systemctl disable firewalld

# yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save


四、關閉虛擬內存和selinux

# swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

# setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config


五、調整內核參數

# vim /etc/sysctl.d/kubernetes.conf

必須的參數:

net.bridge.bridge-nf-call-iptables=1

net.bridge.bridge-nf-call-ip6tables=1

net.ipv6.conf.all.disable_ipv6=1

可選的優化參數:

net.ipv4.ip_forward=1

net.ipv4.tcp_tw_recycle=0

vm.swappiness=0         #禁止使用swap空間,只有當系統oom時才容許使用它

vm.overcommit_memory=1          #不檢查物理內存是否夠用

vm.panic_on_oom=0               #開啓oom

fs.inotify.max_user_instances=8192

fs.inotify.max_user_watches=1048576

fs.file-max=52706963

fs.nr_open=52706963

net.netfilter.nf_conntrack_max=2310720


六、調整系統時區

# timedatectl set-timezone Asia/Shanghai

# timedatectl set-local-rtc 0

# systemctl restart rsyslog crond


七、關閉系統不須要的服務

# systemctl stop postfix && systemctl disable postfix


八、設置rsyslogd和systemd journald

# mkdir /var/log/journal               #持續化保存日誌的目錄

# mkdir /etc/systemd/journald.conf.d

# cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF

[Journal]

#持續化保存到磁盤

Storage=persistent


#壓縮歷史日誌

Compress=yes


SyncIntervalSec=5m

RateLimitInterval=30s

RateLimitBurst=1000


#最大佔用空間 10G

SystemMaxUse=10G


#單日誌文件最大 200M

SystemMaxFileSize=200M


#日誌保存時間 2周

MaxRetentionSec=2week


#不將日誌轉發到 syslog

ForwardToSyslog=no

EOF


# systemctl restart systemd-journald


九、升級系統內核爲4.4

centos7x 系統自帶的3.10.x內核存在一些bugs,致使運行的docker、kubernetes不穩定

# rpm -Uvh https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm

# yum --enablerepo=elrepo-kernel install -y kernel-lt

# grub2-set-default "CentOS Linux (4.4.202-1.el7.elrepo.x86_64) 7 (Core)"

# reboot


十、kube-proxy開啓ipvs的前置條件

# modprobe br_netfilter

# cat > /etc/sysconfig/modules/ipvs.modules << EOF

#!/bin/bash

modprobe -- ip_vs

modprobe -- ip_vs_rr

modprobe -- ip_vs_wrr

modprobe -- ip_vs_sh

modprobe -- nf_conntrack_ipv4

EOF

chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4


十一、安裝docker軟件

# yum install -y yum-utils device-mapper-persistent-data lvm2

# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# yum update -y && yum install -y docker-ce

# grub2-set-default "CentOS Linux (4.4.202-1.el7.elrepo.x86_64) 7 (Core)"  && reboot                         #重啓後請確認內核版本是4.4

# systemctl start docker && systemctl enable docker

## 配置deamon

# cat > /etc/docker/daemon.json << EOF

{

   "exec-opts": ["native.cgroupdriver-systemd"],

   "log-driver": "json-file",

   "log-opts": {

     "max-size": "100m"

   }

}

EOF

# mkdir -p /etc/systemd/system/docker.service.d

# systemctl daemon-reload && systemctl restart docker && systemctl enable docker


十二、安裝kubeadm(主從配置)

# vim /etc/yum.repos.d/kubernetes.repo

[kubernetes]

name=kubernetes

baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64

enabled=1

gpgcheck=0

repo_gpgcheck=0

gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg

http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

# yum -y install kubeadm-1.15.1 kubectl-1.15.1 kubelet-1.15.1

# systemctl enable kubelet.service


1三、上傳所需的鏡像(kubeadm-basic.images.tar)

# tar xvf kubeadm-basic.images.tar.gz

# vim load-images.sh

#!/bin/bash

# ls /root/kubeadm-basic.images > /tmp/image-list.txt

# cd /root/kubeadm-basic.images

for i in $(cat /tmp/image-list.txt)

do

        docker load -i $i

done

rm -rf /tmp/image-list.txt                           

# chmod a+x load-images.sh

# . load-images.sh 








如下在主節點執行:(此處指k8s-master01節點)

初始化主節點

# kubeadm config print init-defaults > kubeadm-config.yaml

# vim kubeadm-config.yaml

localAPIEndpoint:

  advertiseAddress: 172.20.120.187             #修改成主節點IP地址

kubernetesVersion: v1.15.1                          #修改成正確的版本信息

networking:

  dnsDomain: cluster.local

  podSubnet: 10.244.0.0/16                          #添加flannel網絡插件提供的pod子網的默認地址

  serviceSubnet: 10.96.0.0/12

---                                                                        #將默認的調度方式改成ipvs方式

apiVersion: kubeproxy.config.k8s.io/v1alpha1                   

kind: KubeProxyConfiguration

featureGates:

  SupportIPVSProxyMode: true

mode: ipvs

# kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs | tee kubeadm-initlog              #kubeadm初始化並記錄日誌信息

# mkdir -p $HOME/.kube

# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

# chown $(id -u):$(id -g) $HOME/.kube/config

# kubectl get node               #獲取節點狀態,此處因沒有扁平化網絡,因此status爲noready;



部署網絡:

# mkdir -pv install-k8s/{core,plugin}

# mv kubeadm-initlog kubeadm-config.yaml install-k8s/core                     #kubeadm-initlog kubeadm-config.yaml須要留存

# mkdir install-k8s/plugin/flannel

# cd install-k8s/plugin/flannel

# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

# kubectl create -f kube-flannel.yml 

驗證:

# kubectl get pod -n kube-system          #查看名稱空間爲kube-system的pod狀態

# kubectl get node                                 #此處狀態爲ready

# ifconfig | grep -A6 flannel                   #flannel網絡信息




將其餘節點加入主節點,在須要加入的節點執行:(命令在kubeadm初始化時的日誌中獲取)

# kubeadm join 172.20.120.187:6443 --token abcdef.0123456789abcdef \

    --discovery-token-ca-cert-hash sha256:d968d2936e8d3af4e2765805fa041621c90447217281d761cdb17ca5e5eb9a40 

驗證:

# kubectl get pod -n kube-system -o wide               #支持-w 表示監視

# kubectl get nodes                                                 #狀態應該爲ready,支持-w 表示監視






企業級docker私有倉庫:harbor,此處單獨安裝在harbor節點   

https://github.com/goharbor/harbor/blob/master/docs/installation_guide.md

要求:

Docker engine                     version 17.06.0-ce+ or higher       https://docs.docker.com/install/linux/docker-ce/centos/

Docker Compose               version 1.18.0 or higher                  https://docs.docker.com/compose/install/

Openssllatest is preferred


安裝docker:

# yum install -y yum-utils device-mapper-persistent-data lvm2

# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# yum install -y docker-ce

# systemctl start docker && systemctl enable docker

## 配置deamon

# cat > /etc/docker/daemon.json << EOF

{

   "exec-opts": ["native.cgroupdriver-systemd"],

   "log-driver": "json-file",

   "log-opts": {

     "max-size": "100m"

   }

}

EOF

# mkdir -p /etc/systemd/system/docker.service.d

# systemctl daemon-reload && systemctl restart docker && systemctl enable docker

驗證docker

# docker --version

# docker run hello-world


安裝docker-compose

# curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# chmod +x /usr/local/bin/docker-compose

驗證docker-compose

# docker-compose  --version


安裝harbor:https://github.com/goharbor/harbor/releases

# curl -L  http://harbor.orientsoft.cn/harbor-1.2.0/harbor-offline-installer-v1.2.0.tgz -o /root/

# tar xvf harbor-offline-installer-v1.2.0.tgz -C /usr/local/

準備https所需證書

# mkdir -pv /data/cert

# cd /data/cert

# openssl genrsa -des3 -out server.key 2048

# openssl req -new -key server.key -out server.csr

# cp server.key server.key.org

# openssl rsa -in server.key.org -out server.key

# openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt

修改harbor配置文件,並初始化

# cd /usr/local/harbor/

# vim harbor.cfg

hostname = hub.51dlx.com

ui_url_protocol = https

db_password = admin123

ssl_cert = /data/cert/server.crt

ssl_cert_key = /data/cert/server.key

harbor_admin_password = admin123

# ./prepare

# ./install.sh

驗證harbor:web訪問https://hub.nice.com    


配置docker訪問harbor,全部節點必須(含harbor本機)

一、主機名和ip解析。

# cat /etc/hosts

172.20.120.187 k8s-master01

172.20.120.184 k8s-node01

172.20.120.183 k8s-node02

172.20.120.182 hub.nice.com

二、將harbor列爲可信倉庫,並重啓docker

# vim /etc/docker/daemon.json

{

   "exec-opts": ["native.cgroupdriver-systemd"],

   "log-driver": "json-file",

   "log-opts": {

     "max-size": "100m"

   },

   "insecure-registries": ["https://hub.nice.com"]                              #將harbor列爲可信倉庫

}

# systemctl restart docker

驗證:

# docker login https://hub.nice.com              #輸入帳號密碼,是否登陸成功

# docker pull wangyanglinux/myapp:v1        #下載一個鏡像

# docker tag wangyanglinux/myapp:v1 hub.nice.com/library/myapp:v1                  #按照固定格式,修改鏡像tag

# docker push hub.nice.com/library/myapp:v1                                                         #上傳修改後的鏡像到harbor,請到web上查看

# docker rmi -f wangyanglinux/myapp:v1 hub.nice.com/library/myapp:v1               #刪除剛纔下載和重命名的鏡像


harbor的相關操做:

一、中止

# cd /usr/local/harbor

# docker-compose stop

二、中止後重啓

# cd /usr/local/harbor

# docker-compose start

三、從新配置並啓動

# cd /usr/local/harbor

# docker-compose down -v

# vim harbor.yml

# ./prepare

# docker-compose up -d




在主節點操做(此處指k8s-master01節點):測試k8s集羣狀態,以及k8s和harbor的鏈接

# kubectl run nginx-deployment --image=hub.nice.com/library/myapp:v1 --port=80 --replicas=1

# kubectl get deployment

# kubectl get rs

# kubectl get pod -o wide                           #查看pod詳細信息,如運行在哪一個節點,驗證:在該節點docker ps -a | grep nginx查看

# kubectl scale --replicas=3 deployment/nginx-deployment                  #擴展副本數爲3

# kubectl expose deployment nginx-deployment --port=20000 --target-port=80                     #爲nginx-deployment建議負載均衡

# kubectl get svc                                                                                                                    

# ipvsadm -Ln                                                                                                                          #查看具體負載的信息

# kubectl edit svc nginx-deployment

type: NodePort                                                                                                                   #將nginx-deployment的模式改成NodePort,映射到主機端口











什麼是資源?:k8s中全部的內容都抽象爲資源,資源實例化以後,叫作抽象

資源分類:

一、名稱空間級別:

a、工做負載型資源(workload):Pod、ReplicaSet、Deployment、StatefulSet、Daemonset、Job、Cronjob

b、服務發現及負載均衡型資源(ServiceDiscovery LoadBalance):Service、Ingress

c、配置與存儲型資源:Volume(存儲卷)、CSI(容器存儲接口,可擴展各類各樣的第三方存儲卷)

d、特殊類型的存儲卷:ConfigMap(當配置中心來使用的資源類型)、Secret(保存敏感數據)、DownwardAPI(把外部環境中的信息輸出給容器)


二、集羣級資源:Namespace、Node、Role、ClusterRole、RoleBinding、ClusterRoleBinding


三、元數據型資源:HPA、PodTemplate、LimitRange



# kubectl explain -h                  #獲取具體資源的幫助信息



如何寫一個pod模板?

# vim pod.yaml

apiVersion: v1

kind: Pod

metadata:

name: myapp-pod

labels:

app: myapp

version: v1

spec:

containers:

- name: app

image: hub.nice.com/library/myapp:v1

# kubectl apply -f pod.yaml   或者  kubectl create -f pod.yaml 


如何排錯?

# kubectl get pod名稱 -o wide

# kubectl describe pod pod名稱

# kubectl log pod名稱 -c 容器名                               #查看具體pod內某容器的日誌信息

# kubectl exec pod名稱 -c 容器名 -it -- /bin/sh        #進入pod的容器內



pod的生命週期:pause(網絡和存儲初始化)--》init容器(按順序執行成功,且成功後退出)--》main容器


main容器內的探針:是由kubelet對容器執行的按期診斷。

探針分類:

一、ExecAction:在容器內執行命令。返回碼爲0,則認爲診斷成功;

二、TCPSocketAction:對指定端口上的容器的IP地址進行TCP檢查。端口開放,則認爲診斷成功;

三、HTTPGetAction:對指定端口和路徑上的容器的IP地址執行HTTP Get請求。響應的狀態碼大於等於200且小於400,則認爲診斷成功。


探測方式:

一、livenessProbe:指示容器是否正在運行。若是存活探測失敗,則kubelet會殺死容器,而且容器將受到其 重啓策略 的影響。

二、readinessProbe:指示容器是否準備好服務請求。若是就緒探測失敗,則ready狀態顯示失敗,且端點控制器將從與pod匹配的全部service的端點中刪除該pod的ip地址。


結合liveness和readiness探針的樣例:存在index1.html則ready,不存在index.html則重啓pod,且readiness須要從新檢測。

apiVersion: v1

kind: Pod

metadata:

  name: readiness-liveness

  namespace: default

spec:

  containers:

  - name: app

    image: hub.nice.com/library/myapp:v1

    imagePullPolicy: IfNotPresent

    ports:

    - name: http

      containerPort: 80

    readinessProbe:

      httpGet:

        port: 80

        path: /index1.html

      initialDelaySeconds: 1

      periodSeconds: 3

    livenessProbe:

      httpGet:

        port: 80

        path: /index.html

      initialDelaySeconds: 1

      periodSeconds: 3

      timeoutSeconds: 10




什麼是控制器?:kubernetes中內建了不少控制器,即狀態機,用來控制pod的具體狀態和行爲。

控制器分類:

一、ReplicationController(RC已被淘汰)和ReplicaSet(RS):用來確保容器應用的副本數始終保持在用戶定義的副本數,即若是有容器異常退出,會自動建立新的Pod來替代;若是異常多出來的容器也會自動回收。RS支持經過標籤(label)進行集合式selector。


二、Deployment:爲Pod和ReplicaSet提供了一個聲明式定義(declarative)方法,用來替代之前ReplicationController來方便的管理應用。

典型的應用場景包括:

a、定義deployment來建立pod和replicaset

b、滾動升級和回滾應用

c、擴容和縮容

d、暫停和繼續Deployment


三、DaemonSet:確保所有(或者一些)Node上運行一個Pod的副本,當有Node加入集羣時,也會爲他們新增一個Pod。當有Node從集羣中移除時,這些Pod也會被回收。刪除DaemonSet將會刪除它建立的全部Pod。

典型用法:

a、運行集羣存儲daemon

b、在每一個Node上運行日誌收集daemon

c、在每一個Node上運行監控daemon


四、StateFullSet:做爲controller爲pod提供惟一的標識,它能夠部署和scale的順序。是爲了解決有狀態服務的問題(對應deployment和replicaset是爲無狀態服務而設計),其應用場景包括:

a、穩定的持久化存儲。即pod從新調度後仍是能訪問到相同的持久化數據,基於pvc來實現。

b、穩定的網絡標誌。即pod從新調度後其podname和hostname不變,基於headless service(即沒有cluster ip的service)來實現。

c、有序部署、有序擴展。即pod是有順序的,在部署或擴展時要依據定義的順序依次進行(即從0到N-1,在下一個pod運行以前全部以前的pod必須都是running和ready狀態),基於init container來實現。

d、有序收縮、有序刪除。(即從N-1到0)


五、Job/CronJob

Job:負責批處理任務,即僅執行一次的任務,它保證批處理任務的一個或多個Pod成功結束。

CronJob:管理基於時間的Job。即a、在給定的時間點只運行一次;b、週期性在給定時間點運行。


六、Horizontal Pod Autoscaling:可根據應用的資源使用率的高峯、低峯,使pod水平自動縮放,提升集羣的總體資源利用率。




service的概念:是一個pod的邏輯分組,一種能夠訪問它們的策略。一般稱爲微服務。

service可以提供負載均衡的能力,可是在使用上有限制:默認只提供4層負載均衡能力,而沒有7層功能,但有時咱們可能須要更多的匹配規則來轉發請求,這點上4層負載均衡是不支持的。如需提供7層負載均衡能力,經過插件ingress來實現。


service在k8s中有如下四種類型:

a、ClusterIp:默認類型,自動分配一個僅cluster內部能夠訪問的虛擬ip。

b、NodePort:在clusterip基礎上爲service在每臺機器上綁定一個端口,這樣就能夠經過nodeip:nodeport來訪問該服務。

c、LoadBalancer:在nodeport基礎上,藉助cloud provider建立一個外部負載均衡器,並將請求轉發到nodeip:nodeport。

d、ExternalName:把集羣外部的服務引入集羣內部來,在集羣內部直接使用。沒有任何類型代理被建立,須要kubernetes 1.7+版本支持。





ingress-nginx              官方網站:https://kubernetes.github.io/ingress-nginx/

因爲所需的鏡像在國外沒法下載,此處改成:

# docker pull registry.aliyuncs.com/google_containers/nginx-ingress-controller:0.26.1

將鏡像上傳到harbor倉庫

# docker tag registry.aliyuncs.com/google_containers/nginx-ingress-controller:0.26.1 hub.nice.com/library/nginx-ingress-controller:0.26.1

# docker login hub.nice.com

# docker push hub.nice.com/library/nginx-ingress-controller:0.26.1


k8s-master01節點操做:

# mkdir -pv install-k8s/plugin/ingress

# cd install-k8s/plugin/ingress

# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml

# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/baremetal/service-nodeport.yaml

修改mandatory.yaml,將鏡像位置指定到hub.nice.com/library/nginx-ingress-controller:0.26.1

# vim mandatory.yaml

          image: hub.nice.com/library/nginx-ingress-controller:0.26.1

# kubectl apply -f install-k8s/plugin/ingress/mandatory.yaml

# kubectl get pod -n ingress-nginx                                 #查看

# kubectl apply -f service-nodeport.yaml

# kubectl get svc -n ingress-nginx                                  #查看


ingress http代理訪問

此處示例:www1.nice.com 和www2.nice.com 的http訪問

# vim svc-1.yaml

apiVersion: extensions/v1beta1

kind: Deployment

metadata:

  name: deployment1

spec:

  replicas: 2

  template:

    metadata:

      labels:

        name: nginx1

    spec:

      containers:

        - name: nginx1

          image: wangyanglinux/myapp:v1

          imagePullPolicy: IfNotPresent

          ports:

            - containerPort: 80

---

apiVersion: v1

kind: Service

metadata:

  name: svc-1

spec:

  ports:

    - port: 80

      targetPort: 80

      protocol: TCP

  selector:

    name: nginx1

# kubectl apply -f svc-1.yaml


# vim svc-2.yaml

apiVersion: extensions/v1beta1

kind: Deployment

metadata:

  name: deployment2

spec:

  replicas: 2

  template:

    metadata:

      labels:

        name: nginx2

    spec:

      containers:

        - name: nginx2

          image: wangyanglinux/myapp:v2

          imagePullPolicy: IfNotPresent

          ports:

            - containerPort: 80

---

apiVersion: v1

kind: Service

metadata:

  name: svc-2

spec:

  ports:

    - port: 80

      targetPort: 80

      protocol: TCP

  selector:

    name: nginx2

# kubectl apply -f svc-2.yaml


# vim ingress.yaml 

apiVersion: extensions/v1beta1

kind: Ingress

metadata:

  name: ingress1

spec:

  rules:

    - host: www1.nice.com

      http:

        paths:

        - path: /

          backend:

            serviceName: svc-1

            servicePort: 80

---

apiVersion: extensions/v1beta1

kind: Ingress

metadata:

  name: ingress2

spec:

  rules:

    - host: www2.nice.com

      http:

        paths:

        - path: /

          backend:

            serviceName: svc-2

            servicePort: 80

# kubectl apply -f ingress.yaml


查看及驗證:

# kubectl get deployment -o wide

# kubectl get deployment -o wide

# kubectl get pod -n ingress-nginx

# kubectl exec nginx-ingress-controller-6bbc7595b7-rmxbm -n ingress-nginx -it -- /bin/bash

# kubectl get svc -o wide -n ingress-nginx                                    #獲取ingress暴露的端口號

# kubectl get ingress                                                                     #查看全部ingress的規則信息     

作好域名解析後,瀏覽器訪問域名加端口號去確認是否生效。


ingress https代理訪問

建立證書,以及 cert 存儲方式

# mkdir install-k8s/https

# cd install-k8s/https

# openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/O=nginxsvc"

# kubectl create secret tls tls-secret --key tls.key --cert tls.crt

此處示例新建一個 www3.nice.com 的https訪問

# cp svc-2.yaml install-k8s/https/svc-3.yaml

# vim install-k8s/https/svc-3.yaml

apiVersion: extensions/v1beta1

kind: Deployment

metadata:

  name: deployment3

spec:

  replicas: 2

  template:

    metadata:

      labels:

        name: nginx3

    spec:

      containers:

        - name: nginx3

          image: wangyanglinux/myapp:v3

          imagePullPolicy: IfNotPresent

          ports:

            - containerPort: 80

---

apiVersion: v1

kind: Service

metadata:

  name: svc-3

spec:

  ports:

    - port: 80

      targetPort: 80

      protocol: TCP

  selector:

    name: nginx3

# kubectl apply -f install-k8s/https/svc-3.yaml

# vim install-k8s/https/https-ingress.yaml

apiVersion: extensions/v1beta1

apiVersion: extensions/v1beta1

kind: Ingress

metadata:

  name: ingress3

spec:

  tls:

    - hosts:

      - www3.nice.com

      secretName: tls-secret

  rules:

    - host: www3.nice.com

      http:

        paths:

        - path: /

          backend:

            serviceName: svc-3

            servicePort: 80

# kubectl apply -f install-k8s/https/https-ingress.yaml

作好域名解析後,瀏覽器訪問域名加端口號去確認是否生效。



Nginx 進行 BasicAuth

# yum -y install httpd

# mkdir -pv basic-auth && cd basic-auth

# htpasswd -c auth foo

# kubectl create secret generic basic-auth --from-file=auth

此處示例對svc-1進行認證,auth.nice.com

# vim basic-auth.yaml

apiVersion: extensions/v1beta1

kind: Ingress

metadata:

  name: ingress-with-auth

  annotations:

    nginx.ingress.kubernetes.io/auth-type: basic

    nginx.ingress.kubernetes.io/auth-secret: basic-auth

    nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - foo'

spec:

  rules:

  - host: auth.nice.com

    http:

      paths:

      - path: /

        backend:

          serviceName: svc-1

          servicePort: 80

# kubectl apply -f basic-auth.yaml

作好域名解析後,瀏覽器訪問域名加端口號去確認是否生效。


image.png

此處示例:將www4.nice.com訪問重定向到https://www3.nice.com:30317

# vim rewrite.yaml

apiVersion: extensions/v1beta1

kind: Ingress

metadata:

  name: ingress-rw

  annotations:

    nginx.ingress.kubernetes.io/rewrite-target: https://www3.nice.com:30317

spec:

  rules:

  - host: www4.nice.com

    http:

      paths:

      - path: /

        backend:

          serviceName: svc-3

          servicePort: 80

kubectl apply -f rewrite.yaml

作好域名解析後,瀏覽器訪問域名加端口號去確認是否生效。


kubernetes存儲分類:

1、configMap:ConfigMap API 給咱們提供了向容器中注入配置信息的機制,ConfigMap 能夠被用來保存單個屬性,也 能夠用來保存整個配置文件或者 JSON 二進制大對象(明文存儲)

2、Secret:解決了密碼、token、密鑰等敏感數據的配置問題,而不須要把這些敏感數據暴露到鏡像或者 Pod Spec 中。Secret 能夠以 Volume 或者環境變量的方式使用 。有三種類型: 

一、Service Account :用來訪問 Kubernetes API,由 Kubernetes 自動建立,而且會自動掛載到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目錄中 

二、Opaque :base64編碼格式的Secret,用來存儲密碼、密鑰等 

三、kubernetes.io/dockerconfigjson :用來存儲私有 docker registry 的認證信息

3、Volume:持久存儲容器中的文件和容器間共享文件。經常使用卷的類型:

一、empty:當 Pod 被分配給節點時,首先建立 emptyDir 卷,而且只要該 Pod 在該節點上運行,該卷就會存在。正如卷的名 字所述,它最初是空的。Pod 中的容器能夠讀取和寫入 emptyDir 卷中的相同文件,儘管該卷能夠掛載到每一個容 器中的相同或不一樣路徑上。當出於任何緣由從節點中刪除 Pod 時, emptyDir 中的數據將被永久刪除;注意:容器崩潰不會從節點移除pod,所以empty卷中的數據在容器崩潰時是安全的。

二、hostPath:將主機節點的文件系統中的文件或目錄掛載到集羣中。

4、PersistentVolume(pv持久卷):PV 是 Volume 之類的卷插件,但具備獨立於使用 PV 的 Pod 的生命週期。此 API 對象包含存儲實現的細節,即 NFS、 iSCSI 或特定於雲供應商的存儲系統。

PersistentVolumeClaim(pvc持久卷聲明):是用戶存儲的請求。它與 Pod 類似。Pod 消耗節點資源,PVC 消耗 PV 資源。Pod 能夠請求特定級別的資源 (CPU 和內存)。聲明能夠請求特定的大小和訪問模式(例如,能夠以讀/寫一次或 只讀屢次模式掛載)。

相關文章
相關標籤/搜索