Kubernetes之yaml文件详解

[TOC] 一、YAML基础 YAML是专门用来写配置文件的语言,非常简洁和强大,使用比json更方便。它实质上是一种通用的数据串行化格式。 YAML语法规则: 大小写敏感 使用缩进表示层级关系 缩进时不允许使用Tal键,只允许使用空格 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可 ”#” 表示注释,从这个字符一直到行尾,都会被解析器忽略 在Kubernetes中,只需要知道两种结构类型即可: Lists Maps 123456789 1.1 YAML Maps Map顾名思义指的是字典,即一个Key:Value 的键值对信息。例如: apiVersion: v1 kind: Pod 注:---为可选的分隔符 ,当需要在一个文件中定义多个结构的时候需要使用。上述内容表示有两个键apiVersion和kind,分别对应的值为v1和Pod。 123 Maps的value既能够对应字符串也能够对应一个Maps。例如: apiVersion: v1 kind: Pod metadata: name: kube100-site labels: app: web 123456 注:上述的YAML文件中,metadata这个KEY对应的值为一个Maps,而嵌套的labels这个KEY的值又是一个Map。实际使用中可视情况进行多层嵌套。 YAML处理器根据行缩进来知道内容之间的关联。上述例子中,使用两个空格作为缩进,但空格的数据量并不重要,只是至少要求一个空格并且所有缩进保持一致的空格数 。例如,name和labels是相同缩进级别,因此YAML处理器知道他们属于同一map;它知道app是lables的值因为app的缩进更大。 注意:在YAML文件中绝对不要使用tab键 1.2 YAML Lists List即列表,说白了就是数组,例如: args -beijing -shanghai -shenzhen -guangzhou 12345 可以指定任何数量的项在列表中,每个项的定义以破折号(-)开头,并且与父元素之间存在缩进。在JSON格式中,表示如下: { "args": ["beijing", "shanghai", "shenzhen", "guangzhou"] } 123 当然Lists的子项也可以是Maps,Maps的子项也可以是List,例如: apiVersion: v1 kind: Pod metadata: name: kube100-site labels: app: web spec: containers: - name: front-end image: nginx ports: - containerPort: 80 - name: flaskapp-demo image: jcdemo/flaskapp ports: 8080 123456789101112131415 如上述文件所示,定义一个containers的List对象,每个子项都由name、image、ports组成,每个ports都有一个KEY为containerPort的Map组成,转成JSON格式文件: ...

February 18, 2018

k8s 常见问题

[TOC] 自己在搭建k8s集群的时候遇到的问题,和解决方法记录下来. 1.etcd服务 kubernetes和flannel存储数据等,单台etcd不稳定,最好是搭建集群。搭建集群的时候,集群之间通信如果要添加认证的话,需要签署证书。同时把证书拷贝到制定文件目录,在etcd.service中制定证书文件。 cat > etcd-csr.json <<EOF { "CN": "etcd", "hosts": [ "127.0.0.1", "${NODE_IP}" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "BeiJing", "L": "BeiJing", "O": "k8s", "OU": "System" } ] } EOF cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem \ -ca-key=/etc/kubernetes/ssl/ca-key.pem \ -config=/etc/kubernetes/ssl/ca-config.json \ -profile=kubernetes etcd-csr.json | cfssljson -bare etcd mkdir -p /etc/etcd/ssl cp etcd*.pem /etc/etcd/ssl cd mkdir -p /var/lib/etcd cat > etcd.service <<EOF [Unit] Description=Etcd Server After=network.target After=network-online.target Wants=network-online.target Documentation=https://github.com/coreos [Service] Type=notify WorkingDirectory=/var/lib/etcd/ ExecStart=/root/local/bin/etcd \\ --name=${NODE_NAME} \\ --cert-file=/etc/etcd/ssl/etcd.pem \\ --key-file=/etc/etcd/ssl/etcd-key.pem \\ --peer-cert-file=/etc/etcd/ssl/etcd.pem \\ --peer-key-file=/etc/etcd/ssl/etcd-key.pem \\ --trusted-ca-file=/etc/kubernetes/ssl/ca.pem \\ --peer-trusted-ca-file=/etc/kubernetes/ssl/ca.pem \\ --initial-advertise-peer-urls=https://${NODE_IP}:2380 \\ --listen-peer-urls=https://${NODE_IP}:2380 \\ --listen-client-urls=https://${NODE_IP}:2379,http://127.0.0.1:2379 \\ --advertise-client-urls=https://${NODE_IP}:2379 \\ --initial-cluster-token=etcd-cluster-0 \\ --initial-cluster=${ETCD_NODES} \\ --initial-cluster-state=new \\ --data-dir=/var/lib/etcd Restart=on-failure RestartSec=5 LimitNOFILE=65536 [Install] WantedBy=multi-user.target EOF cp etcd.service /etc/systemd/system/ 2.flannel网络 flannel网络也可以添加认证 ...

January 27, 2018

k8s学习内容汇总

[TOC] 根据马哥教育k8s教程学习。 k8s学习大纲 - 基础大纲 - 集群部署及陈述式命令管理 - 资源类型及配置清单 - pod资源 - pod 控制器 - service资源 - 存储卷 - configmap与secret资源 - statefulset控制器 - 认证、授权及准入控制 - 网络模型及网络策略 - pod资源调度 - crd、自定义资源、自定义控制器及自定义API server, cni=Custom/Container Network Interface, crd=CustomResourceDefinition, CRI=Container Runtime Interface - 资源指标与HPA控制器 - Helm管理器 - 高可用kubernetes Cloud Native Apps: 云原生应用,程序开发出来就是运行在云平台上,而非单机上的应用。 Serverless: 与云原生应用组合,成为新的发展趋势,FaaS。 Knative。 单体应用程序: 亦称巨石应用,牵一发而动全身。 分成架构服务: 每个团队维护一个层次。(比如用户,商品,支付) 微服务(Microservice): 服务拆分成多个小功能,单独运行。 - 服务注册和服务发现: 分布式和微服务存在的问题 - 三五个程序运行支撑的服务转变为 三五十个微型服务,服务之间的调用成为网状结构。 - 非静态配置,动态服务发现,服务总线 - 服务编排系统: 解决运维部署难的问题 - 容器编排系统: 解决系统异构,服务依赖环境各不相同。 服务编排系统 --> 容器编排系统 容器编排系统: (主流: k8s, Borg, Docker Swarm, Apache Mesos Marathon DC/OS ) what is container orchestration? - container orchestration is all about managing the lifecycles of containers, especially in large, dynamic environments. - software teams use container orchestration to control and automade many task: - provisioning and deployment of containers - redundancy and availability of containers - scaling up or removing containers to spread application load evently across host infrastructure - movement of containers from one host to another if there is a shortage of resources in host, or if a host dies. - allocation of resources between containers - exteral exposure of services running in a container with the outside world - load balancing of service discovery between containers - heath monitoring of containers and hosts - configuration of an application in relation to the containers runing it 简单来说,容器编排是指容器应用的自动布局、协同及管理,它主要负责完成以下具体内容: service discovery load balancing secrets/configuration/storage management heath checks auto-[scaling/restart/healing] of containers and nodes zero-downtime deploys - pod资源 - pod 控制器: pod创建方式: - 自助式pod: 直接创建pod - 由控制器管理pod: 创建deployment,service等 ReplicationControler: ReplicaSet/rs: - 副本数 - 标签选择 - pod资源摸版 - kubectl explain rs - kubectl explain rs.spec - replicas - selector - template Deployment: 无状态任务,关注群体行为. 只关注数量,不关注个体. - kubectl explain deploy.spec - replicas - selector - template - strategy: 更新策略 - rollingUpdate - maxSurge: 最多超出目标pod数量 1/20% - maxUnavailable: 最多不可用数量. 1/80% - type - Recreate - rollingUpdate - minReadySeconds - revisionHistoryLimit: 保存历史版本数量限制 DaemonSet/ds: 每个node节点只运行一个,eg:ELK. - kubectl explain ds.spec - selector - template - minReadySeconds - revisionHistoryLimit: 保存历史版本数量限制 - updateStrategy Service: 工作模式: userspace, iptables, ipvs. (kube-proxy) userspace: 1.1- iptables: 1.10- ipvs: 1.11+ - NodePort/ClusterIP : client --> NodeIP:NodePort --> ClusterIP:ServicePort --> PodIP:containerPort - LBAAS(LoadBalancerAsAService): 公有云环境中. - LoadBalancer - ExternalName - FQDN - CNAME -> FQDN - No ClusterIP: Headless Service - ServiceName -> PodIP - kubectl explain svc - type: ExternalName, ClusterIP, NodePort, LoadBalancer - port: - NodePort # type=NodePort 时 可用. client --> NodeIP:NodePort --> ClusterIP:ServicePort --> PodIP:containerPort - LBAAS(LoadBalancerAsAService): 公有云环境中. - LoadBalancer - ExternalName - FQDN - CNAME -> FQDN - - port - targetPort Ingress: Service: ingress-nginx (NodePort, DaemonSet - HostNetwork) IngressController: ingress-nginx Ingress: - site1.ikubernetes.io (virtual host) - site2.ikubernetes.io (virtual host) - example.com/path1 - example.com/path2 - Service: site1 - pod1 - pod2 - Service: site2 - pod3 - pod4 - 存储卷 - emptyDir - 临时目录, 内存使用, 没有持久性 - gitRepo - hostPath - 共享存储 - SAN: iSCSI - NAS: nfs, cifs, http - 分布式存储: - glusterfs - ceph: rbd - cephfs: - 云存储 - EBS - Azure Disk - pvc: persistentVolumeClaim - pv - pvc - pod - volumes - - secret base64 的 configmap - configmap: 配置中心 配置容器化应用的方式: 1. 自定义命令行参数; args: [] 2.把配置文件直接copy进镜像 3.环境变量 1.Cloud Native的应用程序一般可直接通过环境变量加载配置 2.通过entrypoint.sh脚本来预处理变量为配置文件中的配置信息 4.存储卷 - 变量注入 --> pod 读取变量 - 挂载存储卷 --> pod 读取配置 - 自定义命令行参数 - StatefulSet: PetSet -> StatefulSet 应对有以下要求的服务: 1.稳定且唯一的网络标识符 2.稳定且持久的存储 3.有序平滑的部署和扩展 4.有序平滑的删除和终止 5.有序的滚动更新 三个组件: - headless service: clusterIP: None - StatefulSet - volumeClaimTemplate - 认证、授权及准入控制 - Authentication - restful API: token - tls: 双向认证 - user/password - Authorization - rbac - role - rolebinding - ClusterRole - ClusterRoleBinding - webhook - abac - Admission Control client --> API Server pod --> api server - ServiceAccount? - secret - ServiceAccountName kubectl get secret kubectl get sa | serviceaccount kubectl create serviceaccount my-sa -o yaml --dry-run kubectl get pods myapp -o yaml --export API request path: http://IP:port/apis/apps/v1/namespaces/default/deployments/myapp-deploy/ http request ver: get, post, put, delete http request --> API requests verb: get, list, create, update, patch, watch, proxy, redirect, delete, delectcollection Resource: Subresource: Namespace: API group: - ServiceAccount: alex.crt (umask 077; openssl genrsa -out alex.key 2048) openssl req -new -key alex.key -out alex.csr -subj "/CN=alex" openssl x509 -req -in alex.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out alex.crt -days 3650 openssl x509 -in alex.crt -text -noout kubectl config set-cluster alex-cluster --server="https://192.168.137.131:6443" --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true --kubeconfig=/tmp/alex.conf kubectl config set-credentials admin \ --client-certificate=datasets/work/admin/admin.pem \ --client-key=datasets/work/admin/admin-key.pem \ --embed-certs=true \ --kubeconfig=/tmp/alex.conf kubectl config set-context alex@kubernetes --cluster=kubernetes --user=admin --kubeconfig=/tmp/alex.conf kubectl config use-context kubernetes --kubeconfig=/tmp/alex.conf kubectl get pods --kubeconfig=/tmp/alex.conf (error from server forbidden) - RBAC - role, clusterrole object: resource group resource non-resource url action: get, list, watch, patch, delete, deletecollection, ... - rolebinding, clusterrolebinding subject: user group serviceaccount role: - role: - operations - objects - rolebinding: - user account or service account - role - clusterrole - clusterrolebinding # kubectl create role --help # kubectl create rolebinding --help # kubectl create role pods-reader --verb=get,list,watch --resource=pods --dry-run=client -o yaml apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: creationTimestamp: null name: pods-reader namespace: default rules: - apiGroups: - "" resources: - pods verbs: - get - list - watch # kubectl create rolebinding alex-read-pods --role=pods-reader --user=alex --dry-run=client -o yaml apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: creationTimestamp: null name: alex-read-pods roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: pods-reader subjects: - apiGroup: rbac.authorization.k8s.io kind: User name: alex # 接着上面 ServiceAccount 的例子 # kubectl config use-context kubernetes --kubeconfig=/tmp/alex.conf # kubectl get pods --kubeconfig=/tmp/alex.conf # kubectl get pods -n kube-system --kubeconfig=/tmp/alex.conf (error from server forbidden) # kubectl create clusterrole --help # kubectl create clusterrolebinding --help - Kubernetes Dashboard - helm install kubernetes-dashboard/kubernetes-dashboard --version 2.3.0 --name=k8s-dashboard [--namespaces=dashboard] - helm fetch kubernetes-dashboard/kubernetes-dashboard --version 2.3.0 - tar xf kubernetes-dashboard-2.3.0.tgz - vim kubernetes-dashboard/values.yaml - helm install kubernetes-dashboard/kubernetes-dashboard --version 2.3.0 --name=k8s-dashboard -f kubernetes-dashboard/values.yaml [--namespaces=dashboard] - kubectl create clusterrolebinding k8s-dashboard-admin --clusterrole=cluster-admin --serviceaccount=default:k8s-dashboard / [--serviceaccount=dashboard:k8s-dashboard] - kubectl describe sa k8s-dashboard [-n dashboard] - kubectl describe secret k8s-dashboard-token-xxxx [-n dashboard] - 网络模型及网络策略 flannel kubectl get daemonset -n kube-system kubectl get pods -o wide -n kube-system |grep -i kube-flannel kubectl get configmap -n kube-system kubectl get configmap kube-flannel-cfg -o json -n kube-system from 10.244.1.59 ping 10.244.2.76 tcpdump -i cni0 -nn icmp tcpdump -i flannel.1 -nn tcpdump -i ens32 -nn host 192.168.137.131 overlay otv calico - pod资源调度 调度器: 预选策略: 优先函数: 节点选择器: nodeSelector, nodeName 节点亲和调度: nodeAffinity taint的effect定义对Pod排斥效果: NoSchedule:仅影响调度过程,对现存的Pod对象不产生影响; NoExecute:既影响调度过程,也影响现在的Pod对象;不容忍的Pod对象将被驱逐; PreferNoSchedule: - crd、自定义资源、自定义控制器及自定义API server - HeapSter (数据采集) - cAdvisor (数据指标检测) - InfluxDB (历史数据记录: 时序数据库系统) - Grafana (数据展示) - RBAC 资源指标: metrics-server: k8s资源聚合器 自定义指标: - prometheus - k8s-prometheus-adapter - MertricServer - PrometheusOperator - NodeExporter - kubeStateMetrics - Prometheus - Grafana 新一代架构: 核心指标流水线: 由kubelet、metrics-server以及由API server提供的api组成;CPU累积使用率、内存实时使用率、Pod的资源占用率及容器的磁盘占用率; 监控流水线: 用于从系统收集各种指标数据并提供终端用户、存储系统以及HPA,它们包含核心指标及许多非核心指标。非核心指标本身不能被k8s所解析, metrics-server: API server - Helm管理器: chart repository Tiller: chart: - 配置清单 - 模板文件 - helm install mem1 stable/memcached # kubectl explain ingress.spec FIELDS: backend <Object> resource <Object> serviceName <string> servicePort <string> ingressClassName <string> rules <[]Object> host <string> http <Object> paths <[]Object> -required- backend <Object> -required- path <string> pathType <string> tls <[]Object> Ingress Controller: - Nginx - Traefik - Envoy namespace: ingress-nginx Job: 一次性任务 Cronjob: 周期性任务 StatefulSet: 关注个体. 对 EDR: Custom Defined Resources, 1.8+ Operator: etcd example: - # ReplicaSet - vim rs-demo.yaml apiVersion: apps/v1 kind: ReplicaSet metadata: name: myapp namespace: default spec: replicas: 2 selector: matchLabels: app: myapp release: canary template: metadata: name: myapp-pod labels: app: myapp release: canary environments: qa sepe: containers: - name: myapp-container image: ikubernetes/myapp:v1 ports: - name: http containerPort: 80 - kubectl create -f rs-demo.yaml - kubectl edit rs myapp --> replicas: 5 - kubectl get pods - kubectl edit rs myapp --> image: ikubernetes/myapp:v2 - kubectl get rs -o wide - curl xx.xx.xxx.xx # 只有重建的pod会使用新的image - # Deployment - vim deploy-demo.yaml apiVersion: apps/v1 kind: Deployment metadata: name: myapp-deploy namespace: default spec: replicas: 2 selector: matchLabels: app: myapp release: canary template: metadata: name: myapp-pod labels: app: myapp release: canary environments: qa sepe: containers: - name: myapp-container image: ikubernetes/myapp:v1 ports: - name: http containerPort: 80 - kubectl apply -f deploy-demo.yaml - kubectl get deploy - kubectl get rs -o wide myapp-deploy-69b47bc96d --> 模板的hash值 - kubectl get pods - kubectl get pods -l app=myapp -w # 新开窗口 - vim deploy-demo.yaml --> image: ikubernetes/myapp:v2 - kubectl apply -f deploy-demo.yaml - kubectl get rs -o wide - kubectl rollout history deployment myapp-deploy # 打补丁方式增加pod - kubectl patch deployment myapp-deploy -p '{"spec":{"replicas":5}}' - kubectl get pods - kubectl patch deployment myapp-deploy -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1,"maxUnavailable":0}}}}' - kubectl describe deployment myapp-deploy - kubectl get pods -l app=myapp -w # 新开窗口-1 - kubectl set image deployment myapp-deploy myapp=ikubernetes/myapp:v3 && kubectl rollout pause deployment myapp-deploy # 暂停rollout, 金丝雀发布 - kubectl rollout status deployment myapp-deploy # 新开窗口-2 - kubectl rollout resume deployment myapp-deploy --> # 查看新开窗口 1, 2 - kubectl rollout history deployment myapp-deploy # 查看历史版本 - kubectl get rs -o wide # 回滚版本 - kubectl rollout undo --help - kubectl rollout undo deployment myapp-deploy --to-revision=1 - kubectl rollout history deployment myapp-deploy # 查看历史版本 - # DaemonSet - vim ds-demo.yaml apiVersion: apps/v1 kind: Deployment metadata: name: redis namespaces: default spec: replicas: 1 selector: matchLabels: app: redis role: logstor template: metadata: labels: app: redis role: logstor spec: containers: - name: redis image: redis:4.0-alpine ports: - name: redis containerPort: 6379 --- apiVersion: apps/v1 kind: DaemonSet metadata: name: filebeat-ds namespace: default spec: replicas: 2 selector: matchLabels: app: filebeat release: stable template: metadata: name: filebeat-pod labels: app: filebeat release: stable sepe: containers: - name: filebeat image: ikubernetes/filebeat:5.6.5-alphine env: - name: REDIS_HOST value: redis.default.svc.cluster.local - name: REDIS_LOG_LEVEL value: info - kubectl apply -f ds-demo.yaml - kubectl get pods - kubectl expose deployment redis --port=6379 - kubect get svc - kubectl exec -it redist-5bxxxx-xxx -- /bin/sh # netstat -tnl # nslookup redis.default.svc.cluster.local # redis-cli -h redis.default.svc.cluster.local # kyes * # DaemonSet 滚动更新 - kubectl set image demonsets filebeat-ds filebeat=ikubernets/filebeat-5.6.6-alphine - kubectl get pods -w # 一个一个的更新. - # Service - vim redis-svc.yaml apiVersion: v1 kind: Service medatada: name: redis namespace: default spec: selector: app: redis role: logstor # clusterIP: 10.96.96.96 type: ClusterIP port: - port: 6349 targetPort: 6379 - kubectl apply -f redis-svc.yaml - kubectl get svc - kubectl describe svc redis - - curl xx.xx.xxx.xx # 只有重建的pod会使用新的image - service资源 Helm: like Linux yum/apt/apk ... k8s Server Master API Server - port: 6443 - auth: 双向认证, /etc/kubernetes/pki - config: ~/.kube/config - kubectl config view - restful api - kubectl api-versions - json - kubectl get pod == curl https://master:6443/v1/... - communicate with all the service - kubectl - kube-controller-manager - kube-scheduler - etcd - kubelet - kube-proxy - api 接口中的资源分成多个逻辑组合 apiVersion - 和解循环(Reconciliation Loop): status --> spec Scheduler Controller - 和解循环(Reconciliation Loop): status --> spec Node: - pod - service -> iptables/ipvs -> kube-proxy - kube-proxy Resource 资源有两个级别: - 集群级别 - Node - Namespace - Role - ClusterRole - RoleBinding - ClusterRoleBinding - PersistentVolume - 名称空间级别 - pod - service - deploy - 元数据型资源 - HPA - PodTemplate - LimitRange 资源组成部分: - apiVersion: group/version (kubectl api-versions) - kind: 资源类别 - metadata - spec: 资源期望状态 - labels/tag: kubectl label - annotations: kubectl annotate - initContainers: kubectl explain pods.spec.initContainers: 容器初始化, 运行前, 运行后, 运行时 (存活检测, 就绪检测) - lifecycle - livenessProbe - readinessProbe - startupProbe - - Containers: kubectl explain pods.spec.Containers: 容器初始化, 运行前, 运行后, 运行时 (存活检测, 就绪检测) - lifecycle: preStart hook, preStop hook - livenessProbe - readinessProbe - startupProbe - name: - command: ["/bin/bash" "-c" "sleep 3600"] - args: - image: - imagePullPolicy: - Never - Always - IfNotPresent - port: - name: - hostIP: - hostPort: - protocol - containerPort - status: 资源当前状态 资源引用Object URL: /apis/<GROUP>/<VERSION>/namespaces/<NAMESPACE_NAME>/<KIND>[/OBJECT_ID]/ - /api/GROUP/VERSION/namespaces/NAMESPACE/TYPE/NAME - kubectl get pod/nginx-ds-s4hpn - selfLink: /api/v1/namespaces/default/pods/nginx-ds-s4hpn 资源记录: SVC_NAME.NS_NAME.DOMAIN.LTD. redis.default.svc.cluster.local - Pod - Pod Controller - Deployment: 类型 --> ngx-deploy --> nginx pod - Service - nginx-svc --> 关联到 nginx pod kubeadm kubectl - kubectl explain pods.spec.initContainers - kubectl -h - basic commands beginner - create - expose - run - set - basic commands intermediate - explan - get - edit - delete - deploy commands - rollout - scale - autoscale - cluster management commands - certificate - cluster-info - top - cordon - uncordon - drain - taint - troubleshooting and debugging commands - describe - logs - attach - exec: kubectl exec -it PodName -c ContainerName -- /bin/sh - port-forward - kubectl config view [-o wide/json/yaml] # kubectl config view apiVersion: v1 clusters: - cluster: certificate-authority-data: DATA+OMITTED server: https://192.168.137.131:6443 name: kubernetes contexts: - context: cluster: kubernetes user: kubernetes-admin name: kubernetes-admin@kubernetes current-context: kubernetes-admin@kubernetes kind: Config preferences: {} users: - name: kubernetes-admin user: client-certificate-data: REDACTED client-key-data: REDACTED - kubectl api-resources: 支持的资源类型 以及缩写 - kubectl get [-o wide/json/yaml] [-n default/kube-system/...] [-L label-name] [-l label-name ==/!= label-value] - all - nodes - pods - ns/namespace - default - kube-public - kube-system - deploy - svc/service - kubectl create [ -f file] - job - namespace - kubectl create namespace testing - kubectl create namespace prod - kubectl create namespace develop - kubectl get ns - kubectl delete namespace testing - kubectl delete ns/prod ns/develop - deployment - kubectl create deployment nginx-deploy --image=nginx:1.14-alpine - kubectl get all -o wide - pod/nginx-deploy-xxxx (ip: 10.244.1.2) - deployment.apps/nginx-deploy - replicaset.apps/nginx-deploy-xxxx - curl 10.244.1.2 ( welcome nginx!) - kubectl delete pod/nginx-deploy-xxxx - kubectl get all -o wide - pod/nginx-deploy-xxxx (ip: 10.244.3.2) ... - curl 10.244.3.2 ( welcome nginx!) - service - kubectl create service -h - ClusterIP - NodePort - kubectl create service clusterip nginx-deploy --tcp=80:80 (名字和上面deploy保持一致,就会自动分配IP) - kubectl get svc/nginx-deploy -o yaml - clusterip: 10.110.129.64 - endpoints: 10.244.3.2 - kubectl describe svc/nginx-deploy # 删除 pod 测试 - curl 10.110.129.64 ( welcome nginx!) - kubectl delete pod/nginx-deploy-xxxx - kubectl get all -o wide - pod/nginx-deploy-xxxx (ip: 10.244.1.3) ... - kubectl get svc/nginx-deploy -o yaml - clusterip: 10.110.129.64 - endpoints: 10.244.1.3 (自动关联到最新的pod) # 删除 service 测试 - curl nginx-deploy.default.svc.cluster.local. ( welcome nginx!) - kubectl delete svc/nginx-deploy - kubectl create service clusterip nginx-deploy --tcp=80:80 (名字和上面deploy保持一致,就会自动分配IP) - kubectl describe svc/nginx-deploy -o yaml - clusterip: 10.111.215.249 - endpoints: 10.244.3.2 - curl nginx-deploy.default.svc.cluster.local. ( welcome nginx!) # 按需伸缩 pod 测试 - kubectl create deploy myapp --image=ikubernetes/myapp:v1 - kubectl get deploy - kubectl get pods -o wide - ip : 10.244.3.3 - curl 10.244.3.3 - curl 10.244.3.3/hostname.html (show the pod name: myapp-xxxx-yyyy) - kubectl create service clusterip myapp --tcp=80:80 - kubectl describe svc/myapp - IP 10.100.182.218 - Endpoints: 10.244.3.3 - curl nginx-deploy.default.svc.cluster.local. ( welcome myapp!) - curl nginx-deploy.default.svc.cluster.local/hostname.html (show the pod name: myapp-xxxx-yyyy) - kubectl scale --replicas=3 myapp (deploy name) - kubectl describe svc/myapp - IP 10.100.182.218 - Endpoints: 10.244.3.3, 10.244.1.4, 10.244.2.2 - curl nginx-deploy.default.svc.cluster.local/hostname.html (随机显示不同IP的pod name,多次重复执行查看效果) - kubectl scale --replicas=2 myapp - kubectl describe svc/myapp - IP 10.100.182.218 - Endpoints: 10.244.3.3, 10.244.1.4 # nodeport 外网访问 - kubectl delete svc/myapp - kubectl create service nodeport -h - kubectl create service nodeport myapp --tcp=80:80 - kubectl get svc - ports: 80:31996/TCP - 集群外部访问所有nodes的 http://nodesip:31996/hostname.html - 自动创建规则在每一个节点的iptables --> kube-proxy - ssh nodes "iptables -t nat -vnL" eg: - kubectl expose - kubectl set image deployment myapp myapp=ikubernetes/myapp:v2 - kubectl label [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--resource-version=version] kubectl label pods -n dev-namespaces apptag=my-app release=stable deltag- - kubectl api-versions - kubectl describe Network - node network - service network: service 注册/发现 - pod network 外网访问: - Service: NodePort - hostport: - hostNetwork: ipvs/iptables 4 层调度器 ingress 7 层调度器

January 10, 2018

k8s 安装

[TOC] 一、在master节点上的操作 众多需要下载和安装的包我都已经下载好了放在集群上,所以后面的安装等就是直接从集群backup目录拷贝过来直接用。 master节点配置的服务有,etcd,flannel,docker,kubectl,kube-apiserver,kube-controller-manager,kube-scheduler,kubelete,kube-proxy,kubedns(插件),kube-dashboard(插件) 1.首先设置环境变量 cat /atlas/backup/kubernetes-1.7.6/environment.sh #!/usr/bin/bash BOOTSTRAP_TOKEN="41f7e4ba8b7be874fcff18bf5cf41a7c" SERVICE_CIDR="10.254.0.0/16" CLUSTER_CIDR="172.30.0.0/16" export NODE_PORT_RANGE="8400-9000" export ETCD_ENDPOINTS="http://172.16.10.18:2379,http://172.16.10.10:2379" export FLANNEL_ETCD_PREFIX="/flannel/network" export CLUSTER_KUBERNETES_SVC_IP="10.254.0.1" export CLUSTER_DNS_SVC_IP="10.254.0.2" export CLUSTER_DNS_DOMAIN="cluster.local." 2.下载cfssl 后面使用cfssl来生成certificate authority cd /atlas/backup/kubernetes-1.7.6/cfssl cp cfssl_linux-amd64 /usr/local/bin/cfssl cp cfssljson_linux-amd64 /usr/local/bin/cfssljson cp cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo 3.创建CA配置文件ca-config.json和签名请求ca-csr.json mkdir /atlas/backup/kubernetes-1.7.6/ssl cd /atlas/backup/kubernetes-1.7.6/ssl/ # vim /atlas/backup/kubernetes-1.7.6/ssl/ca-config.json cat > ca-config.json <<EOF { "signing": { "default": { "expiry": "8760h" }, "profiles": { "kubernetes": { "usages": [ "signing", "key encipherment", "server auth", "client auth" ], "expiry": "8760h" } } } } EOF # vim /atlas/backup/kubernetes-1.7.6/ssl/ca-csr.json cat > ca-csr.json <<EOF { "CN": "kubernetes", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "BeiJing", "L": "BeiJing", "O": "k8s", "OU": "System" } ] } EOF 4.生成证书和私钥 cfssl gencert -initca ca-csr.json | cfssljson -bare ca ls ca* ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem mkdir -pv /etc/kubernetes/ssl cp /atlas/backup/kubernetes-1.7.6/ssl/ca* /etc/kubernetes/ssl 5.加载环境变量 export NODE_NAME=etcd-host0 export NODE_IP=172.16.10.10 export NODE_IPS="172.16.10.10 172.16.10.18" export ETCD_NODES=etcd-host0=http://172.16.10.10:2380,etcd-host1=http://172.16.10.18:2380 source /atlas/backup/kubernetes-1.7.6/environment.sh 6.配置etcd服务 kuberntes 系统使用 etcd 存储所有数据,同时flannel网络服务也会把数据保存到etcd中,etcd服务集群只在login节点和master节点搭建。有些教程在etcd集群和flannel集群中加入了ca认证过程,这里为了简单就没有加密。 ...

December 24, 2017

01-Kubernetes 基础概念和架构解析

[TOC] 1.服务部署的发展 为什么我们需要Kubernetes? 我们先来看看服务部署的发展. 如下图: 1.1 传统部署时代 早期,组织在物理服务器上运行应用程序。无法为物理服务器中的应用程序定义资源边界,这会导致资源分配问题。例如,如果在物理服务器上运行多个应用程序,则可能会出现一个应用程序占用大部分资源的情况,结果可能导致其他应用程序的性能下降。一种解决方案是在不同的物理服务器上运行每个应用程序,但是由于资源利用不足而无法扩展,并且组织维护许多物理服务器的成本很高。 1.2 虚拟化部署时代 作为解决方案,引入了虚拟化功能,它允许您在单个物理服务器的 CPU 上运行多个虚拟机(VM)。于是有了xen, kvm, vmware 和 virualbox 等虚拟化应用的出现. 虚拟化功能允许应用程序在 VM 之间隔离,并提供安全级别,因为一个应用程序的信息不能被另一应用程序自由地访问。 因为虚拟化可以轻松地添加或更新应用程序、降低硬件成本等等,所以虚拟化可以更好地利用物理服务器中的资源,并可以实现更好的可伸缩性。 每个 VM 是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。 1.3 容器部署时代 容器类似于 VM,但是它们具有轻量级的隔离属性,可以在应用程序之间共享操作系统(OS)。因此,容器被认为是轻量级的。容器与 VM 类似,具有自己的文件系统、CPU、内存、进程空间等。由于它们与基础架构分离,因此可以跨云和 OS 分发进行移植。 容器因具有许多优势而变得流行起来。于是docker闪亮登场, 下面列出了容器的一些好处: 敏捷应用程序的创建和部署:与使用 VM 镜像相比,提高了容器镜像创建的简便性和效率。 持续开发、集成和部署:通过快速简单的回滚(由于镜像不可变性),提供可靠且频繁的容器镜像构建和部署。 关注开发与运维的分离:在构建/发布时而不是在部署时创建应用程序容器镜像,从而将应用程序与基础架构分离。 可观察性不仅可以显示操作系统级别的信息和指标,还可以显示应用程序的运行状况和其他指标信号。 跨开发、测试和生产的环境一致性:在便携式计算机上与在云中相同地运行。 云和操作系统分发的可移植性:可在 Ubuntu、RHEL、CoreOS、本地、Google Engine 和其他任何地方运行。 以应用程序为中心的管理:提高抽象级别,从在虚拟硬件上运行 OS 到使用逻辑资源在 OS 上运行应用程序。 松散耦合、分布式、弹性、解放的微服务:应用程序被分解成较小的独立部分,并且可以动态部署和管理 - 而不是在一台大型单机上整体运行。 资源隔离:可预测的应用程序性能。 资源利用:高效率和高密度。 容器是打包和运行应用程序的好方式。在生产环境中,您需要管理运行应用程序的容器,并确保不会停机。例如,如果一个容器发生故障,则需要启动另一个容器。如果系统处理此行为,会不会更容易? 这就是 Kubernetes 的救援方法! 2 Kubernetes简介 Kubernetes 是一个可移植的,可扩展的开源平台,用于管理容器化的工作负载和服务,方便了声明式配置和自动化。它拥有一个庞大且快速增长的生态系统。Kubernetes 的服务,支持和工具广泛可用。 2.1 Kubernetes 功能 Kubernetes 提供的功能: ...

December 17, 2017

Kubernetes设计架构

[TOC] Kubernetes设计架构 Kubernetes集群包含有节点代理kubelet和Master组件(APIs, scheduler, etc),一切都基于分布式的存储系统。下面这张图是Kubernetes的架构图。 Kubernetes主要由以下几个核心组件组成: etcd保存了整个集群的状态; apiserver提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制; controller manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等; scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上; kubelet负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理; Container runtime负责镜像管理以及Pod和容器的真正运行(CRI); kube-proxy负责为Service提供cluster内部的服务发现和负载均衡; 除了核心组件,还有一些推荐的Add-ons: kube-dns负责为整个集群提供DNS服务 Ingress Controller为服务提供外网入口 Heapster提供资源监控 Dashboard提供GUI Federation提供跨可用区的集群 Fluentd-elasticsearch提供集群日志采集、存储与查询 Kubernetes节点 一个培训机构的kubernetes学习课程,用来参考做学习: Chapter 1:课程介绍 理解 Kubernetes 设计原则、原理 了解 Kubernetes 的过去、现在和未来 了解并学会使用 Kubernetes 最重要的资源 -- API 学会如何创建和管理应用,并配置应用外部访问 理解 Kubernetes 网络、存储 掌握 Kubernetes 调度的原理和策略 Kubernetes 一些新功能的概念 了解 Kubernetes 的日志、监控方案 具备基本的故障排查的运维能力 Chapter 2:Kubernetes 基本概念 了解什么是 Kubernetes 了解 Kubernetes 的主要特性 理解为什么需要 Kubernetes 了解 Kubernetes 的过去、现在和未来 了解目前 Kubernetes 社区的情况和被采用情况 了解 Kubernetes 的基本架构 获得一些学习资料推荐 Chapter 3:Kubernetes 架构及原理 理解 Kubernetes 设计原则 深入理解 Kubernetes 集群中的组件及功能 了解 Kubernetes 集群对网络的预置要求 深入理解 Kubernetes 的工作原理 深入理解 Kubernetes 中 Pod 的设计思想 Chapter 4:Kubernetes 安装和配置 了解部署 Kubernetes 的多种方式 可以单机部署 Kubernetes(学习演示使用) 可以在宿主机部署一套 Kubernetes 集群(非生产使用) Chapter 5:Kubernetes API 及集群访问 了解 Kubernetes 的 API 理解 Kubernetes 中 API 资源的结构定义 了解 kubectl 工具的使用 了解 Kubernetes 中 API 之外的其他资源 Chapter 6:ReplicaController,ReplicaSets 和 Deployments 理解 RC 理解 label 和 selector 的作用 理解 RS 理解 Deployments 并且可操作 Deployments 理解 rolling update 和 rollback Chapter 7:Volume、配置文件及密钥 了解 Kubernetes 存储的管理,支持存储类型 理解 Pod 使用 volume 的多种工作流程以及演化 理解 pv 和 pvc 的原理 理解 storage class 的原理 理解 configmaps 的作用和使用方法 理解 secrets 的作用和使用方法资源结构 Chapter 8:Service 及服务发现 了解 Docker 网络和 Kubernetes 网络 了解 Flannel 和 Calico 网络方案 理解 Pod 在 Kubernetes 网络中的工作原理 理解 Kubernetes 中的 Service 理解 Service 在 Kubernetes 网络中的工作原理 理解 Kubernetes 中的服务发现 掌握 Kubernetes 中外部访问的几种方式 Chapter 9:Ingress 及负载均衡 理解 Ingress 和 Ingress controller 的工作原理 掌握如何创建 Ingress 规则 掌握如何部署 Ingress controller Chapter 10:DaemonSets,StatefulSets,Jobs,HPA,RBAC 了解 DaemonSet 资源和功能 了解 StatefulSet 资源和功能 了解 Jobs 资源和功能 了解 HPA 资源和功能 了解 RBAC 资源和功能 Chapter 11:Kubernetes 调度 理解 Pod 调度的相关概念 深度理解 Kubernetes 调度策略和算法 深度理解调度时的 Node 亲和性 深度理解调度时的 Pod 亲和性和反亲和性 深度理解污点和容忍对调度的影响 深度理解强制调度 Pod 的方法 Chapter 12:日志、监控、Troubleshooting 理解 Kubernetes 集群的日志方案 理解 Kubernetes 集群的监控方案 了解相关开源项目:Heapster,Fluentd,Prometheus 等 掌握常用的集群,Pod,Service 等故障排查和运维手段 Chapter 13:自定义资源 CRD 理解和掌握 Kubernetes 中如何自定义 API 资源 可以通过 kubectl 管理 API 资源 了解用于自定义资源的 Controller 及相关使用示例 了解 TPR 和 CRD Chapter 14:Kubernetes Federation 了解 Kubernetes 中 Federation 的作用和原理 了解 Federation 的创建过程 了解 Federation 支持的 API 资源 了解集群间平衡 Pod 副本的方法 Chapter 15:应用编排 Helm,Chart 了解 Kubernetes 中如何进行应用编排 了解 Helm 的作用和工作原理 了解 Tiller 的作用和工作原理 了解 Charts 的作用和工作原理 Chapter 16:Kubernetes 安全 了解 Kubernetes 中 API 访问过程 了解 Kubernetes 中的 Authentication 了解 Kubernetes 中的 Authorization 了解 ABAC 和 RBAC 两种授权方式 了解 Kubernetes 中的 Admission 了解 Pod 和容器的操作权限安全策略 了解 Network Policy 的作用和资源配置方法

November 27, 2017

OpenStack架构简介

[TOC] 1.云计算 云计算是一种按使用量付费的模式,这种模式提供可用的、便捷的、按需的网络访问, 进入可配置的计算资源共享池(资源包括网络,服务器,存储,应用软件,服务),这些资源能够被快速提供,只需投入很少的管理工作,或与服务供应商进行很少的交互。 2.IT系统架构的发展到目前为止大致可以分为3个阶段: 物理机架构 这一阶段,应用部署和运行在物理机上。 比如企业要上一个ERP系统,如果规模不大,可以找3台物理机,分别部署Web服务器、应用服务器和数据库服务器。 如果规模大一点,各种服务器可以采用集群架构,但每个集群成员也还是直接部署在物理机上。 我见过的客户早期都是这种架构,一套应用一套服务器,通常系统的资源使用率都很低,达到20%的都是好的。 虚拟化架构 摩尔定律决定了物理服务器的计算能力越来越强,虚拟化技术的发展大大提高了物理服务器的资源使用率。 这个阶段,物理机上运行若干虚拟机,应用系统直接部署到虚拟机上。 虚拟化的好处还体现在减少了需要管理的物理机数量,同时节省了维护成本。 云计算架构 虚拟化提高了单台物理机的资源使用率,随着虚拟化技术的应用,IT环境中有越来越多的虚拟机,这时新的需求产生了: 如何对IT环境中的虚拟机进行统一和高效的管理。 有需求就有供给,云计算登上了历史舞台。 云平台是一个面向服务的架构,按照提供服务的不同分为 IaaS、PaaS 和 SaaS。 请看下图 IaaS(Infrastructure as a Service)提供的服务是虚拟机。 IaaS 负责管理虚机的生命周期,包括创建、修改、备份、启停、销毁等。 使用者从云平台得到的是一个已经安装好镜像(操作系统+其他预装软件)的虚拟机。 使用者需要关心虚机的类型(OS)和配置(CPU、内存、磁盘),并且自己负责部署上层的中间件和应用。 IaaS 的使用者通常是数据中心的系统管理员。 典型的 IaaS 例子有 AWS、Rackspace、阿里云等 PaaS(Platform as a Service)提供的服务是应用的运行环境和一系列中间件服务(比如数据库、消息队列等)。 使用者只需专注应用的开发,并将自己的应用和数据部署到PaaS环境中。 PaaS负责保证这些服务的可用性和性能。 PaaS的使用者通常是应用的开发人员。 典型的 PaaS 有 Google App Engine、IBM BlueMix 等 SaaS(Software as a Service)提供的是应用服务。 使用者只需要登录并使用应用,无需关心应用使用什么技术实现,也不需要关系应用部署在哪里。 SaaS的使用者通常是应用的最终用户。 典型的 SaaS 有 Google Gmail、Salesforce 等 3.OpenStack OpenStack 对数据中心的计算、存储和网络资源进行统一管理。 由此可见,OpenStack 针对的是 IT 基础设施,是 IaaS 这个层次的云操作系统。 ...

November 27, 2017

acme.sh配合letsencrypt配置泛域名

[TOC] MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。 1. 安装 acme.sh curl https://get.acme.sh | sh 将会安装到 ~/.acme.sh/ 目录下,以后所有的配置默认也在这个目录下 2. 生成证书 acme.sh 实现了 acme 协议支持的所有验证协议. 一般有两种方式验证: http 和 dns 验证,这里仅介绍 DNS 方式 具体 dnsapi 链接), 这里以 阿里云 为例: 首先获取你的阿里云API Key: ak-console.aliyun.com/#/accesskey 之后在你的终端配置文件中设置: export Ali_Key="Your AccessKey ID" export Ali_Secret="Your Access Key Secret" 之后直接使用如下命令发起申请(注意这里第一个域名为顶级域名,后面个为泛域名。): acme.sh --issue --dns dns_ali -d example.com -d *.example.com *.second.example.com curl https://get.acme.sh | sh -s email=xxx@xx.com exit # tencent api token address: # https://console.dnspod.cn/account/token export DP_Id="xxx" export DP_Key="xxx" acme.sh --issue --dns dns_dp -d lsbgb.com -d *.lsbgb.com acme.sh --issue --dns dns_dp -d lsbgb.com -d *.lsbgb.com --fullchain-file /etc/nginx/ssl/lsbgb.com/fullchain.cer --key-file /etc/nginx/ssl/lsbgb.com/lsbgb.com.key --dnssleep acme.sh --issue --dns dns_dp -d k8s.lsbgb.com -d *.k8s.lsbgb.com acme.sh --issue --dns dns_dp -d k8s.lsbgb.com -d *.k8s.lsbgb.com --fullchain-file /etc/nginx/ssl/k8s.lsbgb.com/fullchain.cer --key-file /etc/nginx/ssl/k8s.lsbgb.com/k8s.lsbgb.com.key --dnssleep # crontab -l # cat ~/.acme.sh/account.conf 三级域名申请 申请了顶级域名和二级域名,但在使用三级域名的时候还是会报不安全的错误,所以如果你想要用三级域名的话,也必须在申请的时候写上 ...

October 3, 2017

shadowsocks server

[TOC] vultr的vps性价比越来越高了,带宽不限,5美刀的流量都有1024G/月 .废话不多说,直接开始说搭建。 首先连接上vultr的一个vps。 安装shadowsocks ubuntu 18 apt install shadowsocks 其它系统 安装依赖shadowsocks依赖包 apt install python-pip python-m2crypto -y pip install setuptools pip install wheel 安装shadowsocks pip install shadowsocks 修改配置文件 cat /etc/shadowsocks.json { "server": "0.0.0.0", "server_port": 55555, #设置你的ss服务端口 # "server_port": [55555, 44444], #开启多个端口 "password": "your_password", #设置ss服务连接密码 "timeout": 300, "method": "aes-256-cfb", "fast_open": false } 开启ss服务 ssserver -c /etc/shadowsocks.json -d start 系统重启之后,自动开启 cat /etc/rc.local ulimit -n 51200 ssserver -c /etc/shadowsocks.json -d start 添加用户和端口 为什么要添加用户? root用户密码太他喵的难敲了!一堆很长的随机字符串,各种配合shift的都有,登录一次贼费劲. 而且在console端不可以粘贴。所以换一个用户,帮助太大了。 ...

October 1, 2017

frp

[TOC] frp frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力,且尝试性支持了点对点穿透。 当然还有一些其他的内网穿透工具,比如 telebit ngrok . 但效果都不太理想. 首先telebit, 服务器在国外,国内使用延迟特别高,当然可以自己搭建 telebit-relay 但是坑特别多,我提issue想让作者处理一下,得到的回复是这样的: Thanks for the report. We don’t have update install instructions for the relay server yet and we don’t have time to update and test them right now, so you’ll have to use the official server https://telebit.cloud until we do. Right now our efforts are focused on improving the Telebit Remote client. 于是果断放弃。 ...

September 15, 2017