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

做好域名解析后,浏览器访问域名加端口号去确认是否生效。

kubenetes(k8s)学习笔记

此处示例:将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