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