千家信息网

kubenetes(k8s)学习笔记

发表于:2024-12-03 作者:千家信息网编辑
千家信息网最后更新 2024年12月03日,kubernetes(K8S) google特点:1、轻量级:消耗资源小2、开源3、弹性伸缩4、负载均衡高可用集群副本数据最好是 >= 3 奇数个组件说明:主要组件:APISERVER:所有服务访问的
千家信息网最后更新 2024年12月03日kubenetes(k8s)学习笔记

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 <

[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 和内存)。声明可以请求特定的大小和访问模式(例如,可以以读/写一次或 只读多次模式挂载)。








0