kubenetes(k8s)学习笔记
kubernetes(K8S) google
创新互联主要从事成都做网站、网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务贵港,10余年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:028-86922220
特点:
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 < [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 和内存)。声明可以请求特定的大小和访问模式(例如,可以以读/写一次或 只读多次模式挂载)。
分享标题:kubenetes(k8s)学习笔记
文章出自:http://hbruida.cn/article/gpihig.html