您好,登录后才能下订单哦!
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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。