希望长大对我而言,是可以做更多想做的事,而不是被迫做更多不想做的事...... 首页 k8s初识 丁D 学无止境 2019-05-02 17:25 4233已阅读 Kubernetes k8s 摘要Kubernetes作为容器集群管理工具,具有负载均衡,服务发现等功能。 #Kubernetes Kubernetes作为容器集群管理工具,具有负载均衡,服务发现等功能。 ###k8s系统设计图  如上图可以发现: 1.k8s分为**master**和**node**节点 2.master运行着组件**api server**,**scheduler**,**etcd**,**controller manager**,**kubectl** 3.work运行的组件**kubelet**,**kube-proxy**,**docker**    ###各个组件的作用 1.**etcd**运行在master节点上,保存着集群中所有的资源对象(可高可用)。 2.**scheduler**运行在master,为新建立的Pod进行节点选择(即分配机器),负责集群的资源调度。 3.**api server**运行在master,提供了资源操作的唯一入口,并提供认证、授权等机制。 4.**controller manager**运行在master,负责执行各种控制器,controllermanager就会负责管理pod的状态,如,若pod挂了,controllermanager就会重新创建一个一样的pod,或者像扩缩容等。 5.**Kubelet**运行在work节点,会从**api server**接收**Pod**的创建请求,启动和停止容器,监听本节点状态信息并汇报给**api server**。 6.**kube-proxy**运行在work节点,提供了**负载均衡**的功能 ###执行流程 用户执行kubectl/userClient向api server发起一个命令,经过认证授权后,经scheduler的各种策略,得到一个目标node,然后告诉api server,api server 会请求相关node的kubelet,通过kubelet把pod运行起来,apiserver还会将pod的信息保存在etcd;pod运行起来后,controllermanager就会负责管理pod的状态,如,若pod挂了,controllermanager就会重新创建一个一样的pod,或者像扩缩容等;pod有一个独立的ip地址,但pod的IP是易变的,如异常重启,或服务升级的时候,IP都会变,这就有了service;完成service工作的具体模块是kube-proxy;在每个node上都会有一个kube-proxy,在任何一个节点上访问一个service的虚拟ip,都可以访问到pod;service的IP可以在集群内部访问到,在集群外呢?service可以把服务端口暴露在当前的node上,外面的请求直接访问到node上的端口就可以访问到service了; kube-dns实现通过名字来访问到一个pod  ###核心概念 **Pod** pod是k8s最小的调度单元,操作单元,运行着至少一个容器,当只运行一个容器的时候可以直接当作一个应用容器(最常见的用法),一个pod里面的容器之间可以使用localhost来访问。 **RC(Replication Controller)** ReplicationController(简称RC)是确保用户定义的Pod副本数保持不变。可以跨节点监听pod。 在用户定义范围内,如果pod增多,则ReplicationController会终止额外的pod,如果减少,RC会创建新的pod,始终保持在定义范围 **Service** Service可以看成一组pod对外的一个访问入口,一个Pod 的逻辑分组,一种可以访问它们的策略 —— 通常称为微服务。 这一组 Pod 能够被 Service 访问到,通常是通过 Label Selector来关联 **Label** Label是一个key/value,可以看成一个标签,用来标记对象,可以用来关联对象比如 Service通过label来找到对应的pod **replication controller与deployment的区别** Deployment同样为Kubernetes的一个核心内容,主要职责同样是为了保证pod的数量和健康,90%的功能与Replication Controller完全一样,可以看做新一代的Replication Controller。但是,它又具备了Replication Controller之外的新特性: Replication Controller全部功能:Deployment继承了上面描述的Replication Controller全部功能。 事件和状态查看:可以查看Deployment的升级详细进度和状态。 回滚:当升级pod镜像或者相关参数的时候发现问题,可以使用回滚操作回滚到上一个稳定的版本或者指定的版本。 版本记录: 每一次对Deployment的操作,都能保存下来,给予后续可能的回滚使用。 暂停和启动:对于每一次升级,都能够随时暂停和启动。 **Ingress** 通常情况下,service和pod的IP仅可在集群内部访问。集群外部的请求需要通过负载均衡转发到service在Node上暴露的NodePort上,然后再由kube-proxy将其转发给相关的Pod。 而Ingress就是为进入集群的请求提供路由规则的集合,如下图所示 ```js internet | [ Ingress ] --|-----|-- [ Services ] ``` ###深入理解pod ####共享volume ####配置管理 configMap ####生命周期 重启 健康检查 pod的**生命周期**如下图所示:  **重启策略** 默认是always **always**:一定会重启 **onFailure**:退出码不为0,会重启 **never**:不重启 ####pod调度 1.系统内置的调度算法 2.定义pod的时候,使用nodeSelector做定向调度 3.定义pod的使用,使用nodeAffinity做亲和度调度 **定向调度:** ```js //1.给对应的node打一个标记使用label kubectl label nodes node-name label-key=labelvalue //2.配置pod nodeSelector: zone: north ``` **亲和度调度**:xxx ####pod扩容和缩容 在实际工作中我们经常会遇到需要添加或降低服务实例数量。我们可以利用rc的scale机制来处理 ,数量是最终期望的实例数,比如原本有2个则新增2个,原本有5个则减少1个。 ```js kubectl scale rc rc-name --replicas=4 ``` ####滚动更新 当我们需要更新的时候,我们需要停止所有相关的pod,然后使用rc来创建新的pod(拉起镜像启动),但是停止所有的pod,会导致服务长时间停止提供服务。k8s提供rolling-update来解决问题  ```js kubectl rolling-update old-rc-name -f new-rc-name.yaml ``` 注意: 1.新旧rc的名字不能相同。 2.selector label至少要有一个不同。 问题 如下旧版rc和新rc 新的多个version label跟旧的不一样。。按道理是要可以的 但实际上会出现 ```js error: mysql-rc-v2.yaml must specify a matching key with non-equal value in Selector for mysql-rc 这个可能是个bug 参考 http://valleylord.github.io/post/201603-kubernetes-roll/ 旧rc selector: app: mysql-pod 新rc selector: app: mysql-pod version: v2 ``` ###常用命令 ```js //一次性创建service和rc kubectl create -f my-service.yaml -f my-rc.yaml //根据目录来创建 kubectl create -f dir //查看pod kubectl get pods //查看service rc kubectl get rc,service //查看node详情 kubectl describe nodes node-name //注意容器内应用的日志的生命周期,跟容器的生命周期是一样的。所以容器销毁之后就没了, //要查看日志可以使用挂载日志或者使用第三方工具:es来收集 //查看容器里面应用程序输出到stdout的日志 kubectl logs pod-name //相当tail -f pod多个容器要指定容器 kubectl logs -f pod-name -c container-name 查看master etcd controller-manager scheduler是否正常 kubectl get cs 查看pod信息 kubectl get pod 查看资源对象详情 kubectl describe 如 kubectl describe pod podname 查看podname的详情 比如容器一直显示创建中 可以看看为什么 服务日志 journalctl -f -u 服务名 服务状态 systemctl status 服务名 ``` ###集群的搭建 ```js [root@localhost kubernetes]# cat apiserver2 KUBE_ETCD_SERVERS="--etcd-servers=http://127.0.0.1:2379" KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0" KUBE_API_PORT="--insecure-port=0" KUBE_SECURE_PORT="--secure-port=443" KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=169.169.0.0/16" KUBE_SERVICE_PORT="--service-node-port-range=1-65535" KUBE_ADM="--admission_control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota" KUBE_LOGTOSTDERR="--logtostderr=false" KUBE_LOG_DIR="--log-dir=/var/log/kubernetes" KUBE_LOG_LEVEL="--v=2" CA_FILE="--client-ca-file=/etc/kubernetes/ca.crt" TLS_PK="--tls-private-key-file=/etc/kubernetes/server.key" TLS_FILE="--tls-cert-file=/etc/kubernetes/server.crt" [root@localhost kubernetes]# ==================================== ==================================== ==================================== [root@localhost kubernetes]# cat /usr/lib/systemd/system/kube-apiserver2.service [Unit] Description=kubernetes api server After=etcd.service Wants=etcd.service [Service] EnvironmentFile=/etc/kubernetes/apiserver2 ExecStart=/usr/bin/kube-apiserver \ ${KUBE_LOGTOSTDERR} \ ${KUBE_LOG_LEVEL} \ ${KUBE_ETCD_SERVERS} \ ${KUBE_API_ADDRESS} \ ${KUBE_API_PORT} \ ${KUBE_SECURE_PORT} \ ${KUBE_SERVICE_ADDRESSES} \ ${KUBE_SERVICE_PORT} \ ${KUBE_LOG_DIR} \ ${CA_FILE} \ ${TLS_PK} \ ${TLS_FILE} Type=notify Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target ``` ```js [root@localhost kubernetes]# cat controller-manager KUBE_MASTER="--master=https://192.168.144.3:443" KUBE_LOGTOSTDERR="--logtostderr=false" KUBE_LOG_DIR="--log-dir=/var/log/kubernetes" KUBE_LOG_LEVEL="--v=2" CLOUD_PROVIDER="--cloud-provider=" KUBE_CONFIG="--kubeconfig=/etc/kubernetes/cs_config" ROOT_CA_FILE="--root-ca-file=/etc/kubernetes/ca.crt" SERVER_KEY="--service-account-private-key-file=/etc/kubernetes/server.key" [root@localhost kubernetes]# ==================================== ==================================== ==================================== [root@localhost kubernetes]# cat /usr/lib/systemd/system/kube-controller-manager.service [Unit] Description=kubernetes controller manager After=kube-apiserver2.service Requires=kube-apiserver2.service [Service] EnvironmentFile=/etc/kubernetes/controller-manager ExecStart=/usr/bin/kube-controller-manager \ ${KUBE_MASTER} \ ${KUBE_LOGTOSTDERR} \ ${KUBE_LOG_DIR} \ ${KUBE_LOG_LEVEL} \ ${KUBE_CONFIG} \ ${ROOT_CA_FILE} \ ${SERVER_KEY} Type=notify Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target [root@localhost kubernetes]# ``` ```js [root@localhost kubernetes]# cat scheduler KUBE_MASTER="--master=https://192.168.144.3:443" KUBE_LOGTOSTDERR="--logtostderr=true" KUBE_LOG_DIR="--log-dir=/var/log/kubernetes" KUBE_LOG_LEVEL="--v=2" KUBE_CONFIG="--kubeconfig=/etc/kubernetes/cs_config" [root@localhost kubernetes]# ==================================== ==================================== ==================================== [root@localhost kubernetes]# cat /usr/lib/systemd/system/kube-scheduler.service [Unit] Description=kubernetes scheduler After=kube-apiserver2.service Requires=kube-apiserver2.service [Service] EnvironmentFile=/etc/kubernetes/scheduler ExecStart=/usr/bin/kube-scheduler \ ${KUBE_MASTER} \ ${KUBE_LOGTOSTDERR} \ ${KUBE_LOG_DIR} \ ${KUBE_LOG_LEVEL} \ ${KUBE_CONFIG} Type=notify Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target [root@localhost kubernetes]# ==================================== ==================================== ==================================== [root@localhost kubernetes]# cat cs_config apiVersion: v1 kind: Config users: - name: controllermanager user: client-certificate: /etc/kubernetes/cs_client.crt client-key: /etc/kubernetes/cs_client.key clusters: - name: local cluster: certificate-authority: /etc/kubernetes/ca.crt contexts: - context: cluster: local user: controllermanager name: my-context current-context: my-context [root@localhost kubernetes]# ``` ```js [root@localhost kubernetes]# cat kubelet HOSTNAME_OVERRIDE="--hostnmae-override=192.168.144.3" KUBE_LOGTOSTDERR="--logtostderr=false" KUBE_LOG_DIR="--log-dir=/var/log/kubernetes" KUBE_LOG_LEVEL="--v=2" KUBE_FAIL_SWAP="--fail-swap-on=false" KUBE_CONFIG="--kubeconfig=/etc/kubernetes/node/cs_config" [root@localhost kubernetes]# ==================================== ==================================== ==================================== [root@localhost kubernetes]# cat /usr/lib/systemd/system/kubelet.service [Unit] Description=kubernetes kubelet [Service] WorkingDirectory=/var/lib/kubelet EnvironmentFile=/etc/kubernetes/kubelet ExecStart=/usr/bin/kubelet \ ${KUBE_LOGTOSTDERR} \ ${KUBE_LOG_DIR} \ ${KUBE_LOG_LEVEL} \ ${KUBE_CONFIG} \ ${KUBE_FAIL_SWAP} Restart=on-failure [Install] WantedBy=multi-user.target [root@localhost kubernetes]# ==================================== ==================================== ==================================== [root@localhost node]# cat cs_config apiVersion: v1 kind: Config users: - name: kubelet user: client-certificate: /etc/kubernetes/node/kubelet_client.crt client-key: /etc/kubernetes/node/kubelet_client.key clusters: - name: local cluster: server: https://192.168.144.3:443 certificate-authority: /etc/kubernetes/node/ca.crt contexts: - context: cluster: local user: kubelet name: my-context current-context: my-context [root@localhost node]# ``` ```js [root@localhost kubernetes]# cat proxy MASTER="--master=http://192.168.144.3:8080" KUBE_LOGTOSTDERR="--logtostderr=false" KUBE_LOG_DIR="--log-dir=/var/log/kubernetes" KUBE_LOG_LEVEL="--v=2" KUBE_CONFIG="--kubeconfig=/etc/kubernetes/node/cs_config" [root@localhost kubernetes]# ==================================== ==================================== ==================================== [root@localhost kubernetes]# cat /usr/lib/systemd/system/kube-proxy.service [Unit] Description=kubernetes kube-proxy After=network.target Requires=network.service [Service] EnvironmentFile=/etc/kubernetes/proxy ExecStart=/usr/bin/kube-proxy \ ${MASTER} \ ${KUBE_LOGTOSTDERR} \ ${KUBE_LOG_DIR} \ ${KUBE_LOG_LEVEL} \ ${KUBE_CONFIG} Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target [root@localhost kubernetes]# ``` ```js [root@master ~]# cat mysql-service.yaml apiVersion: v1 kind: Service metadata: name: mysql-sv namespace: default labels: ser_label: mysql-sv spec: selector: app: mysql-pod type: NodePort ports: - port: 3306 targetPort: 3306 nodePort: 33060 [root@master ~]# ``` ```js [root@master ~]# cat mysql-rc.yaml --- apiVersion: v1 kind: ReplicationController metadata: name: mysql-rc labels: app: mysql-rc spec: replicas: 1 selector: app: mysql-pod template: metadata: labels: app: mysql-pod spec: containers: - name: mysql image: mysql ports: - containerPort: 3306 env: - name: MYSQL_ROOT_PASSWORD value: "mysql" [root@master ~]# ``` ###高可用etcd master ###日志收集 ###k8s+jenkins+docker+gitlab+ansible构建cicd ###k8s跟swarm对比 ###问题: ```js kubelet1.9以上--api-server不能用了,要在配置文件中指定server(即apiserver的地址) ``` ```js controller-manager一直报错集群未设置cloud-provider或设置不当等相关参数,service将返回如下的错误,而service controller并不会进入到实际的工作,最后提示 Failed to start service controller: WARNING: no cloud provider provided, services of type LoadBalancer will fail或 Failed to start service controller: the cloud provider does not support external load balancers。 ``` ```js scheduler失败 不停重启没错误信息 ``` ```js pause镜像 没有翻墙pull不下来 https://blog.csdn.net/qq_24923725/article/details/82910793 ``` 很赞哦! (11) 上一篇:Compose和Swarm 下一篇:docker+k8s+flannel+ansible 目录 点击排行 Elasticsearch6.3.2之x-pack redis哨兵 2019-07-09 22:05 Redis+Twemproxy+HAProxy+Keepalived 2019-07-12 17:20 GC优化策略和相关实践案例 2019-10-10 10:54 JVM垃圾回收器 2019-10-10 10:23 标签云 Java Spring MVC Mybatis Ansible Elasticsearch Redis Hive Docker Kubernetes RocketMQ Jenkins Nginx 友情链接 郑晓博客 佛布朗斯基 凉风有信 南实博客 Rui | 丁D Java研发工程师 生活可以用「没办法」三个字概括。但别人的没办法是「腿长,没办法」、「长得好看,没办法」、「有才华,没办法」。而你的没办法,是真的没办法。 请作者喝咖啡