您好,登錄后才能下訂單哦!
kubernetes(K8S)? ? ? ?google? ? ?
特點:
1、輕量級:消耗資源小
2、開源
3、彈性伸縮
4、負載均衡
高可用集群副本數據最好是 >= 3 奇數個
組件說明:
主要組件:
APISERVER:所有服務訪問的統一入口
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
1、設置主機名、主機名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
2、安裝依賴包
# yum install epel-release -y
#?yum install conntrack ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git -y
3、設置防火墻為iptables,并清空規則
#?systemctl stop firewalld && systemctl disable firewalld
#?yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save
4、關閉虛擬內存和selinux
#?swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
#?setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
5、調整內核參數
#?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
6、調整系統時區
#?timedatectl set-timezone Asia/Shanghai
#?timedatectl set-local-rtc 0
#?systemctl restart rsyslog crond
7、關閉系統不需要的服務
#?systemctl stop postfix && systemctl disable postfix
8、設置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
9、升級系統內核為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
10、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
11、安裝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
12、安裝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
13、上傳所需的鏡像(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本機)
1、主機名和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
2、將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的相關操作:
1、停止
#?cd /usr/local/harbor
#?docker-compose stop
2、停止后重啟
#?cd /usr/local/harbor
#?docker-compose start
3、重新配置并啟動
#?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中所有的內容都抽象為資源,資源實例化之后,叫做抽象
資源分類:
1、名稱空間級別:
a、工作負載型資源(workload):Pod、ReplicaSet、Deployment、StatefulSet、Daemonset、Job、Cronjob
b、服務發現及負載均衡型資源(ServiceDiscovery LoadBalance):Service、Ingress
c、配置與存儲型資源:Volume(存儲卷)、CSI(容器存儲接口,可擴展各種各樣的第三方存儲卷)
d、特殊類型的存儲卷:ConfigMap(當配置中心來使用的資源類型)、Secret(保存敏感數據)、DownwardAPI(把外部環境中的信息輸出給容器)
2、集群級資源:Namespace、Node、Role、ClusterRole、RoleBinding、ClusterRoleBinding
3、元數據型資源: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對容器執行的定期診斷。
探針分類:
1、ExecAction:在容器內執行命令。返回碼為0,則認為診斷成功;
2、TCPSocketAction:對指定端口上的容器的IP地址進行TCP檢查。端口開放,則認為診斷成功;
3、HTTPGetAction:對指定端口和路徑上的容器的IP地址執行HTTP Get請求。響應的狀態碼大于等于200且小于400,則認為診斷成功。
探測方式:
1、livenessProbe:指示容器是否正在運行。如果存活探測失敗,則kubelet會殺死容器,并且容器將受到其 重啟策略 的影響。
2、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的具體狀態和行為。
控制器分類:
1、ReplicationController(RC已被淘汰)和ReplicaSet(RS):用來確保容器應用的副本數始終保持在用戶定義的副本數,即如果有容器異常退出,會自動創建新的Pod來替代;如果異常多出來的容器也會自動回收。RS支持通過標簽(label)進行集合式selector。
2、Deployment:為Pod和ReplicaSet提供了一個聲明式定義(declarative)方法,用來替代以前ReplicationController來方便的管理應用。
典型的應用場景包括:
a、定義deployment來創建pod和replicaset
b、滾動升級和回滾應用
c、擴容和縮容
d、暫停和繼續Deployment
3、DaemonSet:確保全部(或者一些)Node上運行一個Pod的副本,當有Node加入集群時,也會為他們新增一個Pod。當有Node從集群中移除時,這些Pod也會被回收。刪除DaemonSet將會刪除它創建的所有Pod。
典型用法:
a、運行集群存儲daemon
b、在每個Node上運行日志收集daemon
c、在每個Node上運行監控daemon
4、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)
5、Job/CronJob
Job:負責批處理任務,即僅執行一次的任務,它保證批處理任務的一個或多個Pod成功結束。
CronJob:管理基于時間的Job。即a、在給定的時間點只運行一次;b、周期性在給定時間點運行。
6、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
做好域名解析后,瀏覽器訪問域名加端口號去確認是否生效。
此處示例:將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存儲分類:
一、configMap:ConfigMap API 給我們提供了向容器中注入配置信息的機制,ConfigMap 可以被用來保存單個屬性,也 可以用來保存整個配置文件或者 JSON 二進制大對象(明文存儲)
二、Secret:解決了密碼、token、密鑰等敏感數據的配置問題,而不需要把這些敏感數據暴露到鏡像或者 Pod Spec 中。Secret 可以以 Volume 或者環境變量的方式使用 。有三種類型:?
1、Service Account :用來訪問 Kubernetes API,由 Kubernetes 自動創建,并且會自動掛載到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目錄中?
2、Opaque :base64編碼格式的Secret,用來存儲密碼、密鑰等?
3、kubernetes.io/dockerconfigjson :用來存儲私有 docker registry 的認證信息
三、Volume:持久存儲容器中的文件和容器間共享文件。常用卷的類型:
1、empty:當 Pod 被分配給節點時,首先創建 emptyDir 卷,并且只要該 Pod 在該節點上運行,該卷就會存在。正如卷的名 字所述,它最初是空的。Pod 中的容器可以讀取和寫入 emptyDir 卷中的相同文件,盡管該卷可以掛載到每個容 器中的相同或不同路徑上。當出于任何原因從節點中刪除 Pod 時, emptyDir 中的數據將被永久刪除;注意:容器崩潰不會從節點移除pod,因此empty卷中的數據在容器崩潰時是安全的。
2、hostPath:將主機節點的文件系統中的文件或目錄掛載到集群中。
四、PersistentVolume(pv持久卷):PV 是 Volume 之類的卷插件,但具有獨立于使用 PV 的 Pod 的生命周期。此 API 對象包含存儲實現的細節,即 NFS、 iSCSI 或特定于云供應商的存儲系統。
PersistentVolumeClaim(pvc持久卷聲明):是用戶存儲的請求。它與 Pod 相似。Pod 消耗節點資源,PVC 消耗 PV 資源。Pod 可以請求特定級別的資源 (CPU 和內存)。聲明可以請求特定的大小和訪問模式(例如,可以以讀/寫一次或 只讀多次模式掛載)。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。