共计 43660 个字符,预计需要花费 110 分钟才能阅读完成。
安装配置 Kubernetes 最新版 1.6.1
资源
https://github.com/kubernetes… github 官方资源
https://github.com/kubernetes… 最佳实践范例
https://www.kubernetes.org.cn… 中文社区
https://github.com/kubernetes… UI 管理界面
https://github.com/google/cad… cAdvisor 监控
https://github.com/rootsongjc… 安装实例指导
https://kubernetes.io/ 官网
特性
分布式集群智能负载均衡、故障发现和自我修复、服务滚动升级、服务注册发现、资源自动调度
服务监控、无侵入性。
大部分都可以通过 Kubectl 工具进行增删改查。并保存在 etcd 库。
通过对比 etcd 库中期望状态和实际资源状态的差异实现自动控制
开发,测试,生产环境保持高度一致
持续开发,持续集成以及持续部署
使用 etcd v3 版本,因此可支持的集群规模也扩大至 5,000 个节点,可支持的 Pod 规模也增加到 15 万个
基于角色的访问控制(RBAC)升级到 Beta 版
kubeadm 的集群引导工具升级到了 Beta 版,亮点:所有的通信都通过 TLS 进行
可以通过滚动升级来更新 DaemonSet
API 响应性:99% 的 API 调用应该在一秒之内返回。
Pod 启动时间:99% 的 Pod 及其容器(已拉取镜像)在五秒之内完成启动。
数据格式切换为 protobuf
v1.6 支持配置不超过 2000 个节点、不超过 6 万个 pod、不超过 12 万个集装箱、每个节点不超过 100 个 pod
概念
Node 节点:物理机或公有云上的主机,运行 Pod
Master 节点:集群控制节点,运行
kube-apiserver 提供 Rest 接口。所有资源的操作唯一入口
kube-controller-manager 所有资源的自动化控制中心
kube-scheduler 所有资源调度中心,调度 Pod
etcd 库 保存资源
Work 节点:工作 Node 节点,运行
kubelet 负责 Pod 对应容器的创建,启动停止。向 Master 注册自己并定时汇报本机信息
kube-proxy 实现通信和负载均衡
Docker docker 引擎
Pod : 运行多个容器,里面所有容器都是与一个业务紧密相关的,组合成一个微服务
pause 根容器:运行在 Pod 里,一个 Pod 一个,代理通信和挂载数据卷,代表 Pod 的所有容器的状态
Pod 的里容器共享 Pause 容器的 IP,共享 Pause 容器挂载的存储卷,相互之间文件共享
每个 Pod 都有唯一 IP。一个 Pod 里的容器与另外主机上的 Pod 容器能直接通讯
pod 中多个容器中应用程序相互访问可以使用 localhost 就可以
Pod 中根容器停止,将重启 Pod 即里面所有的容器。
Pod 所在 node 节点宕机,将会被调度到其他 Node 节点中启动
Pod 能限制容器使用的服务器资源 CPU 和内存
cpu 资源,是一个绝对值,和服务器总 cpu 个数无关
以千分之一的配额为最小单位用 m 表示,通常一个容器的 cpu 资源被定义为 100-300m 即 0.1-0.3 个 cpu
内存资源,也是一个绝对值,和服务器总内存数无关,单位可以是 Mi 多少兆
requests: 最小申请值满足容器启动
limits: 最大使用值,限制容器使用量,超过将会被杀死进程并重启
pod 中容器中的主程序必须在前台执行,不能在后台执行。创建的 Docker 镜像必须以一个前台命令作为启动命令。
如果是无法改为前台执行的程序,可以使用 supervisor 辅助,其自身会在前台执行
ConfigMap: 容器应用的配置管理
将容器中程序的配置单独出来管理。通过环境变量或外挂载文件的方式在容器创建时注入
生成为容器内的环境变量。设置成容器启动命令的启动参数。挂载为容器内部的文件目录
ConfigMap 必须在 pod 创建之前创建。也可以定义命名空间,只有同一空间中的 pod 可以引用
使用配置的变量:通过环境变量获取 ConfigMap 中的内容
apiVersion:v1
kind: ConfigMap
metadata:
name: cm-appvars
data: #环境变量形式
apploglevel:info
appdatadir:/var/data
—
apiVersion:v1
kind: Pod
metadata:
name: cm-appvars-pod
spec:
containers:
– name: cm-test
image: busybox
command:[“/bin/sh”,”-c”,”env |grep APP”]
env: #环境变量列表
– name: APPLOGLEVEL #定义环境变量名
valueFrom: #值内容从 ConfigMap 中获取
configMapKeyRef: #ConfigMap 配置
name: cm-appvars #环境变量的值取自 cm-appvars 中
….
“`
Pod 生命周期和状态:
Pending 已经创建 Pod,但 pod 内还有容器的镜像没有创建
Runing Pod 内所有容器都已经创建,并有一个容器在运行
Succedded Pod 内所有容器都已经退出,并不会重启
Failed Pod 内所有容器都已经退出,并有一个容器退出失败
Unknown 未知原因无法获取 Pod 状态,可以是网络原因
失效容器重启时间间隔以 sync-frequency 的 2 倍计算,重启成功 10 分钟之后重置时间
Pod 健康检查:livenessProbe 探针判断容器是否存活
探测方式:Exec:在容器内部执行一个命令,命令返回码为 0,表明健康
TcpSocket:通过容器 IP 和端口执行 TCP 检查,能建立连接表明健康
HttpGet: 通过容器 IP 和端口及路径调用 get 方法,响应状态码大于 200 小于 400 则健康
Pod 调度:将 Pod 分派到哪个 Node 中创建。
定向调度:指定标签的 Node 中创建,先将 Node 打标签 kubectl label nodes node 名 标签 key= 标签 value。再在 Pod 配置中的 nodeSelector: 标签 key:标签 value
DaemonSet: 特定场景调度,在每一个 node 中创建一个 pod 副本
如每个 node 上创建一个存储的,日志采集的,性能健康监控采集的、负载均衡、网关入口
只需要在 Deployment 的配置文件中将 kind:Deployment 改为 kind:DaemonSet 即可,定义的 Pod 将在每一个 node 中创建
Pod 自动扩容缩容:可以手动命令形式配置,也可以使用 HPA 配置文件控制
命令:kubectl autoscale rc php-apache –min=1 –max=10 –cpu-percent=90
表示在 1 -10 之间调整 pod 副本数量,使平均 cpu 使用率维持在 50%。需要 heapster 组件
HPA 配置脚本, 通过 CPU 使用率判断是否扩容,需要 Pod 定义 CPU 资源限制 Request 值
查看扩容缩容 kubectl get hpa 查看自动扩容详情 kubectl describe hpa
只能自动扩容缩容 Deployment,ReplicaSet 或 ReplicationController 资源配置 kind 值
apiVersion: autoscalingv1
kind: HorizontalPodAutoscaler
metadata:
name: php-apache
namespace: default
spec:
scaleTargetRef:
apiVersion: v1
kind: ReplicationController
name: php-appache
minReplicas: 1
maxReplicas: 10
targetCPUUtilizationPercentage:90
Pod 滚动升级:将创建一个新的 RC,然后控制就的 RC 中的 pod 副本数量遂渐减少到 0,同时新的 RC 中的 pod 副本的数量遂渐增加到目标值。要求新旧 RC 在同一命名空间中
kubectl rolling-update 旧 rc 名 -f 新 rc 的 yml 配置文件
新 rc 配置文件中 name 不能和旧的 RC 名字相同,可以加版本号前缀区别
在配置文件中所有 selector 选择器中至少有一个 label 标签和旧的 RC 中的 Label 不同,用来标识新 RC 如添加版本标签 version: v2
最后修改使用升级后的新版本镜像,即可实现升级
或不使用配置文件使用新镜像名 kubectl rolling-update 旧 rc 名 –image=redis-master:2.0
如果发现更新过程中发现配置错误,使用回滚命令,回到指定镜像
kubectl rolling-update 旧 rc 名 –image=redis-master:1.0 –rollback
DaemonSet 的滚动更新 https://kubernetes.io/docs/ta…
必须将其设置 .spec.updateStrategy.type 为 RollingUpdate
检查值,结果应该是 RollingUpdate
kubectl get ds/<daemonset-name> -o go-template='{{.spec.updateStrategy.type}}{{“\n”}}’
或者在创建 DaemonSet 控制器文件时指定,或者在 UI 管理界面中修改更新控制器文件
使用更改后的配置文件使修改生效
kubectl apply -f ds.yaml
查看滚动更新状态
kubectl rollout status ds/<daemonset-name>
结果应该是
daemon set “<daemonset-name>” successfully rolled out
replication controller 滚动更新
https://kubernetes.io/docs/ta…
#仅更新镜像
kubectl rolling-update 副本控制器名 –image=nginx:1.9.1
#回退之前版本
kubectl rolling-update my-nginx –rollback
#使用一个新的配置文件更新
kubectl rolling-update 副本控制器名 -f 配置文件名
配置文件必须选择
metadata.name 新的名字标签使用新标签
每个资源都有事件 Event,记录事件的各种信息,可以帮助排查故障
Label 标签:可以附加在各种资源上,如 Pod、Node、Service、RC 等,一个资源对象可以定义任意数量的多个标签,同一个标签也可以添加到任意数量的多个资源上。用来实现管理,使用标签筛选器查找。常用标签:
版本标签:release:alpha 初始版、release:beta 测试版、release:stable 稳定版
环境标签:environment:dev 开发、environment:production 生产、environment:test 测试
架构标签:role:frontend 前端、role:backend 后端、role:middleware 中间
Replication Controller(RC)副本控制器:定义资源预期期望的环境,声明 pod 副本的数量在任意时刻都符合某个预期值。调度管理 pod
定义了 Pod 期待的副本数量
用户筛选 pod 的 Lable selector 标签选择器
包含了 创建新 pod 的 pod 定义模板
可以动态修改 pod 数量实现自动扩容或缩容 kubectl scale rc php-slave –replicas=3
删除 RC 并不会删除已经通过此 RC 创建的 Pod,删除全部 Pod 可以使用 stop 和 delete 命令
滚动升级,就是通过 RC 的控制,改变 Pod 模板中的镜像版本,停掉旧的 Pod 启动新的 Pod
Replica Set 下一代的 RC。区别是支持集合的标签选择器,RC 只支持等于的选择器
apiVersion: v1
kind: ReplicaSet
metadata:
name: mysql
spec:
selector:
matchLabels:
tier: mysql
matchExpressions:
….
“`
Replica Set 被 Deployment 资源使用。两者替换了 RC 的作用
Deployment : 调度部署是新概念。内部使用 RC 的升级版 Replica Set 实现调度目的。
可以随时知道当前 Pod 部署的进度,查看部署状态数量等信息。
可以修改镜像更新 Deployment,创建新的 Pod
如果当前 Deployment 不稳定,可以回滚之前的版本
同样可以通过 kubectl get rc 查看副本控制信息
同样可以通过 kubectl get pods 查看 pod 的创建信息
创建的 Pod 资源命名规则会以 Deployment 对应的 Replica Set 的名字为前缀
apiVersion: v1
kind: Deployment
metadata:
name: nginx-Deployment
….
Service 服务:定义一个服务的访问入口地址,前端应用如 php 的 Pod 通过这个入口地址,访问背后的一组由 Pod 副本集群组成提供的服务。服务与集群之间通过标签选择器定位,RC 副本控制器保证集群处于预期状态。
服务对外开启访问端口
服务提供负载均衡,负载同一服务的不同 Pod
服务提供全局唯一虚拟 IP 即 Cluster IP,服务生存期内 IP 不会改变。无法被 ping。结合 Service Port 组合成一个具体的通信端口,单独的一个不具备 TCP/IP 通信基础。属于集群内部地址,外部无法访问。外部方法可以设置节点映射端口
服务提供全局唯一的名字
服务发现通过 service 的 Name 和 Cluster IP 做一个 DNS 域名映射解决
DNS 系统支持服务发现,使用服务名作为 DNS 域名。
服务支持多端口通过端口名字区分
Pod 本身是变化的,比如当 Pod 发生迁移,那么 Pod 的 IP 是变化的, 那么 Service 的就是在 Pod 之间起到中转和代理的作用,Service 会生成一个虚拟 IP, 这个虚拟 IP 负载均衡到后端的 Pod 的 IP
iptables-save 查看 iptables 重定向
服务处在多节点服务器上的负载均衡需要一个单独的负载均衡设备,这个不属于 Kubernetes
只要部署了 service 那么无论是使用哪种方式访问服务(访问服务 IP 也好服务域名也好,宿主机端口也好),都会被负载均衡调度,除非只有一个 pod。因为发送到 node 上指定端口的数据,会通过 iptables 重定向到 kube-proxy 对应的端口上。然后由 kube-proxy 进一步把数据负载均衡发送到其中的一个 pod 上。
apiVersion: v1
kind: Service
metadata:
name: mysql-service
spec:
selector:
tier: mysql
type: NodePort #使用节点端口开放服务
ports: #多服务端口支持
– port: 3600
name: service-port
nodePort: 3600 #开放的节点端口,外部使用节点 IP 和此端口可以访问此服务
– port: 3601
….
“`
Volume: 存储卷。挂载在 Pod 中,提供给 Pod 中所有容器共享访问的目录。
生命周期和 Pod 的相同和容器无关,容器的重启终止不会影响。
数据卷类型:
emptyDir:临时的,初始内容为空,不需要指定宿主机对应的目录。Pod 被从 Node 删除时,数据卷数据也被删除。存储应用程序的临时数据。
hostPath: 挂载在宿主机上的文件或目录。容器应用程序生产的日志文件等, 注意不同 Node 的目录文件不一致
Persistent Volume:PV 网络云存储。不属于任何 Node,但可以在任何 Node 上访问。独立于 Pod
https://github.com/kubeup/kub… 阿里云支持存储卷但不支持 PVC
网络存储 PV 类型:NFS(网络文件系统 NAS)、iSCSCI(降级 SAN 存储区域网络企业级存储)、GlusterFS、ceph
阿里云内网速度是共享千兆网卡 1Gbps 速率
定义在 Pod 的配置中
apiVersion: v1 #版本号
kind: Pod # kind 定义这个一个 pod 资源
metadata:
name: myweb #定义 pod 名字
labels: #定义标签
name:myweb
spec: #定义 pod 里容器属性
volumes: #定义数据卷的类型和名字
– name: datavo1
emptyDir: {}
– name: storage
hostPath:
containers:
– name: myweb #定义容器名
image: kuberguide/tomcat-app:v1 #定义容器使用镜像
volumeMounts: #挂载在 pod 的位置
– mountPath: /mydata-data
name: datavo1
…..
“`
Namespace: 命名空间,支持多租户,实现资源隔离。默认空间是 default。不指名空间所有资源 pod、RC、Service 都会被创建到默认命名空间,查询命令不加参数都查询的是默认空间中的对象数据。
kubectl get pods –namespace=developemnt 指定命名空间查询
不同项目组不同空间,或者不同环境不同空间,如紫色医疗和嘟嘟医生,或开发环境、测试环境、正式环境
可以隔离不同空间下不同租户使用资源如:cpu、内存
apiVersion: v1 #版本号
kind: Namespace
metadata:
name: developemnt #
…
# 使用
apiVersion: v1 #版本号
kind: Pod
metadata:
name: myweb
namespace: developemnt #指定 pod 创建在哪个租户下
….
secret 秘钥账号密码资源
#创建一个 ssh 秘钥的资源
kubectl create secret generic nginx-php-ssh-key –from-file=id_rsa=/home/kube_yaml/nginx_php/id_rsa –from-file=id_rsa.pub=/home/kube_yaml/nginx_php/id_rsa.pub
# 使用:挂载使用时 id_rsa 和 id_rsa.pub 这两个键名会作为挂载目录下的文件名,健值会作为文件对应的内容
volumeMounts:
– name: ssh-key
mountPath: “/root/.ssh”
# 环境变量中使用
env:
– name: id_rsa
valueFrom:
secretKeyRef:
name: nginx-php-ssh-key
key: id_rsa.pub
volumes:
name: ssh-keysecret: secretName: nginx-php-ssh-key
Dashboard UI 图形化界面 1.4 版本
https://github.com/kubernetes… 地址
kubectl create -f https://rawgit.com/kubernetes… 安装最新版
需要安装 Heapster 支持
执行 kubectl proxy 启动代理 访问 http://localhost:8001/ui
只能在执行命令的主机上访问,可以通过 apiserver 的代理访问。http://Master 服务器 ip/ui 需要设置 apiserver 支持用户名账号方式访问
kubeadm init 和 kubeadm join 简化安装部署 1.4 版本
service account 服务账号并不是给集群的用户使用的,而是给运行在 pod 里的进程使用的,为 pod 里的进程提供必要的身份证明
为确保集群安全,api server 会对客户端进行身份认证,认证失败无法调用 api。pod 中访问 api server 服务时是以 service 方式访问服务名为 kubernetes 的服务的。这个服务只在 https 443 端口上提供服务,使用的是一种 http token 的认证方式
每个 namespace 命名空间下都有个名为 default 的默认 service account 对象,这个对象里有个名为 tokens 的可以当做 volume 一样被挂载到 pod 里的 secret 秘钥,当 pod 启动时,这个 secret 会被自动挂载到 pod 的指定目录下,来协助 pod 中的进程完成访问 api server 的身份验证过程 kubectl describe serviceaccounts 再查看详情 kubectl describe secrets default-token-xxxx
如果一个 pod 在创建时没有定义 spec.serviceAccountName 属性,系统会自动设置为 default,即大家都是用同一个 namespace 命名空间下默认的 service account 服务账号
service account 服务账号是属于某个具体的 Namespace 空间的
如果一个 Namespace 下没有默认的 service account 账号将会为该空间创建一个 default 默认的 setvice account
在 kube-apiserver 启动参数中 –admission_control=ServiceAccount 准入控制器时,将会验证 pod 里的 service accont 是否合法
如果 pod 的 spec.serviceAccountName 指定了 default 以外的 service account 而该 service account 没有事先被创建,则该 pod 将无法创建
创建一个 service account
openssl genrsa -out /tmp/kube-serviceaccount.key 2048 首先生成 key
kube-apiserver … –service_account_key_file=/tmp/kube-serviceaccount.key 启动参数中添加 key
kube-apiserver –admission_control=…,ServiceAccount 并且 API Server 设置 admission_control 包含 ServiceAccount
kube-controller-manager … –service_account_private_key_file=/tmp/kube-serviceaccount.key… 启动 Controller Manager 增加 service_account_private_key_file
kubectl get serviceaccount –all-namespaces 查看每个 namespace 都会默认创建的一个 ServiceAccount
可以创建一个服务账号
serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: build-robot
namespace: kube-system #不指定命名空间则为 default 默认命名空间
kubectl create -f serviceaccount.yaml 创建
kubectl get serviceaccounts/build-robot -o yaml 查看 ServiceAccount 默认创建一个 secret,也可以手动创建 secret 然后添加到 ServiceAccount。
secrets: – name: build-robot-token-3uazg
创建 Pod 使用 ServiceAccount
busybox-pod.yaml:
apiVersion: v1
kind: Pod
metadata:
name: busybox
spec:
containers:
– image: busybox
command:
– sleep
– “3600”
imagePullPolicy: IfNotPresent
name: busybox
serviceAccountName: build-robot #指定使用的非默认 default 的服务账号
Pod 创建成功后,可以查询 Pod 的容器挂载 /var/run/secrets/kubernetes.io/serviceaccount 位置保存
“Volumes”: {
“/var/run/secrets/kubernetes.io/serviceaccount”: “/var/lib/kubelet/pods/05174b7d-426d-11e5-aacb-005056817c3e/volumes/kubernetes.io~secret/build-robot-token-3uazg”
},
kubectl exec busybox cat /var/run/secrets/kubernetes.io/serviceaccount/token 查看 token。实际上这个目录是 ServiceAccount 的 Secret,里面包含了一个 token, 应用通过使用这个 token 便可以去访问
安装
升级:遂各隔离 Node,等待上面容器执行完成,再更新 Node 上的 kubelet、kube-proxy。全部更新完 node 之后,更新 Master 上的服务
单机本地 Minikube 安装
https://github.com/kubernetes… 代码地址安装说明
支持 DNS、NodePorts、ConfigMaps、Secrets、Dashboards、Ingress
MacOS 安装要求:VirtualBox 虚拟机 和 kubectl 命令行工具
brew install kubectl 安装命令行脚本
kubectl version 检查版本号
brew install bash-completion 安装命令行自动完成支持,节约敲命令
当前 shell 生效
source $(brew –prefix)/etc/bash_completion
source <(kubectl completion bash)
加入环境
echo “source $(brew –prefix)/etc/bash_completion” >> ~/.bash_profile
echo “source <(kubectl completion bash)” >> ~/.bash_profile
开始安装 Minikube
curl -Lo minikube https://storage.googleapis.co… && chmod +x minikube && sudo mv minikube /usr/local/bin/
无法下载可以从官网地址直接下载再安装
https://github.com/kubernetes… 下载地址
sudo mv minikube-darwin-amd64 /usr/local/bin/minikube 移动加改名
chmod +x minikube 执行权限
minikube start 启动
kubectl cluster-info 检查集群是否准备好
eval $(minikube docker-env) #连接集群中的 docker,未连接的 shell 会话无法操作集群中的 docker
docker ps #之后就可以获得运行的 docker 数据
minikube stop 停止集群 保留集群状态和数据,重启将恢复
minikube delete 删除集群
安装仪表盘
由于使用的镜像是在谷歌服务器所以国内访问不到,可以使用阿里云镜像
docker pull registry.cn-hangzhou.aliyuncs.com/kube_containers/kubernetes-dashboard-amd64
再修改 kubernetes-dashboard.yaml 中的镜像来源配置
kubectl create -f https://rawgit.com/kubernetes…
minikube dashboard 获取 web UI 地址
minikube service [-n NAMESPACE] [–url] NAME 获取集群中开放端口的服务访问地址
minikube ip 获取集群服务 IP 地址,任何开放的服务都可以通过该地址和端口号访问
kubectl get service 服务名 –output=’jsonpath=”{.spec.ports[0].nodePort}”‘ 获取集群中服务的访问端口号
之后可以按照一般创建 pod 以及 service 的步骤去创建服务了
查看服务需要使用命名空间参数 kubectl get service kubernetes-dashboard –namespace=kube-system 删除和查询详情都是需要指定命名空间
kubectl describe pod kubernetes-dashboard –namespace=kube-system
注意 gcr.io/google_containers/pause-amd64:3.0 pod 的基础容器 pause 也是在谷歌上
临时解决方法:
https://github.com/kingtongxingsheng/docker-library
https://hub.docker.com/r/carrotking/kubernetes/~/settings/automated-builds/
在我的 dockerhub 上的 kubernetes 项目中自动构建对应镜像
执行 minikube ssh 命令登录到 minikube 节点中或 eval $(minikube docker-env)
拉取镜像到本地仓库中
docker pull carrotking/kubernetes:pause_amd64_3.0
重新 tag:
docker tag image_id gcr.io/google_containers/pause-amd64:3.0
之后就能正常启动这个 test pod 了
kubeadm 安装
完全手动遂一安装 官方参考文档 https://kubernetes.io/docs/ge…
基础依赖管理配置:
多主机网络连通管理,使用 flannel。每个 Node 节点的子网规划 a /24 可以配置 254 个 pod,如果一个主机上不需要启动那么多 pod 也可以 a /25 128 个 pod,a/26 62 个 pod,a/27 30 个 pod
192.168.0.0/16 作为 node 节点的 IP 范围,那么可以有 192.168.0.0/24 – 192.168.255.0/24 个 node 节点主机
集群服务也需要 IP,设置 SERVICE_CLUSTER_IP_RANGE=”192.168.0.0/16″ 将有 65534 个服务可以同时存在,一个节点 254 个 ip 服务占据 1 /3 ip,pod 占据 2 /3 ip
主节点:需要设置静态 IP MASTER_IP;打开任何防火墙以允许访问 apiserver 端口 80 和 443;启用 ipv4 转发 sysctl,net.ipv4.ip_forward = 1
集群命名:CLUSTER_NAME 可以区分测试,开发,不同部门的环境,第三方,互不影响
下载二进制包 etcd 数据库、docker、kubelet 命令、kube-proxy 网络代理、kube-apiserver 接口服务、kub-controller-manager 容器管理、kub-scheduler 调度
DNS 服务
CA 证书 在阿里内网环境可以不用证书验证,使用阿里安全组功能屏蔽外网访问
NFS 网络数据存储服务
flannel 使用 0.7.0 docker pull registry.cn-hangzhou.aliyuncs.com/gcr-io/flannel:v0.7.0-amd64
Etcd 版本使用 Kubernetes 二进制分发中提供的 etcd 版本,目前最新是 3.0.17,经过了广泛测试 docker pull registry.cn-shenzhen.aliyuncs.com/gcrio/etcd-amd64:3.0.17
关闭防火墙 systemctl status firewalld systemctl disable firewalld systemctl stop firewalld
Master 安装 etcd 服务
Master 安装 kube-apiserver、kub-controller-manager、kub-scheduler 作为容器运行 docker pull registry.cn-hangzhou.aliyuncs.com/google-containers/hyperkube-amd64:1.6.1-f50fbf0
wget https://github.com/kubernetes/kubernetes/releases/download/v1.6.1/kubernetes.tar.gz
tar xzvf kubernetes.tar.gz && cd kubernetes && ./cluster/get-kube-binaries.sh 下载 server 和 client 的可执行文件
#执行该 shell 会自动下载 kube 的 server 和 client 可执行文件,其中客户端文件会自动安装在 kubernetes 目录下的 client 文件夹下,只需将 bin 添加到 PATH 下就可以了
cd server &&tar xzvf kubernetes-server-linux-amd64.tar.gz
#查看目录下文件
ll kubernetes/server/bin
cd kubernetes/server/bin
cp -r server/bin/{kube-apiserver,kube-controller-manager,kube-scheduler,kubectl,kube-proxy,kubelet} /usr/local/bin/
# 编辑配置 kubeconfig server 地址为本机当中安装的 apiserver 地址
vim /etc/kubernetes/kubeconfig
current-context: kube-context
apiVersion: v1
kind: Config
users:
– name: controllermanager
user:
client-certificate: /root/ssl/apiserver.pem
clusters:
– name: kubernetes
cluster:
certificate-authority: /root/ssl/ca.pem
server: https://10.29.167.233:6443
contexts:
– context:
cluster: kubernetes
user: controllermanager
name: kube-context
# 编辑公共配置文件主从都有
mkdir -p /etc/kubernetes
vim /etc/kubernetes/config
###
# kubernetes system config
#
# The following values are used to configure various aspects of all
# kubernetes services, including
#
# kube-apiserver.service
# kube-controller-manager.service
# kube-scheduler.service
# kubelet.service
# kube-proxy.service
# 为 true 日志输出到屏幕 false 日志写入文件
KUBE_LOGTOSTDERR=”–logtostderr=false”
#日志保存目录 日志目录主从都要先创建好才能启动服务
KUBE_LOG_DIR=”–log-dir=/var/log/k8s”
# 日志等级 0 is debug 2
KUBE_LOG_LEVEL=”–v=2″
# 是否允许允许系统特权容器 Pod
KUBE_ALLOW_PRIV=”–allow-privileged=true”
# How the controller-manager, scheduler, and proxy find the apiserver
# master 使用本机安装的 apiserver 地址
KUBE_MASTER=”–master=https://10.29.167.233:6443″
查看端口占用 netstat -anp |grep 6443
#编辑 apiserver 配置文件
vim /etc/kubernetes/apiserver
###
## kubernetes system config
##
## The following values are used to configure the kube-apiserver
##
#
## 绑定非安全认证访问地址 insecure-bind-address 默认 0.0.0.0 全部网络,可以允许外部访问,如果放置在负载均衡后面可以绑定本机 IP
KUBE_API_ADDRESS=”–advertise-address=10.29.167.233 –bind-address=0.0.0.0″
#
## 非安全认证访问监听端口默认 8080,安全组中配置外部客户端不可访问
KUBE_API_PORT=”–insecure-port=0″
#
## etcd 集群
KUBE_ETCD_SERVERS=”–etcd-servers=http://10.29.167.233:2379,http://10.29.167.233:2377,http://10.29.167.233:2378″
#
## 服务虚拟 IP 地址池,不能和物理机所在网络重合如 169.169.0.0
KUBE_SERVICE_ADDRESSES=”–service-cluster-ip-range=169.169.0.0/16″
#
## 默认允许控制政策,对发送给 API Server 的任何请求进行拦截和过滤
KUBE_ADMISSION_CONTROL=”–admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota”
#
## Add your own! secure-port= 0 不启用 https 默认 6443
KUBE_API_ARGS=”–cloud-provider=” –enable-garbage-collector=true –secure-port=6443 –service-node-port-range=30000-32767 –apiserver-count=1 –client-ca-file=/home/sharefiles/ssl/ca.pem –tls-cert-file=/home/sharefiles/ssl/kubernetes.pem –tls-private-key-file=/home/sharefiles/ssl/kubernetes-key.pem
–service-account-key-file=/home/sharefiles/ssl/kubernetes-key.pem –etcd-prefix=kubernetes”
# 安装 kube-apiserver 服务
#编辑系统启动服务配置
vim /usr/lib/systemd/system/kube-apiserver.service
[Unit]
Description=Kubernetes API Service
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target
[Service]
EnvironmentFile=/etc/kubernetes/config
EnvironmentFile=/etc/kubernetes/apiserver
ExecStart=/usr/local/bin/kube-apiserver \
$KUBE_LOGTOSTDERR \
$KUBE_LOG_LEVEL \
$KUBE_LOG_DIR \
$KUBE_ETCD_SERVERS \
$KUBE_API_ADDRESS \
$KUBE_API_PORT \
$KUBE_ALLOW_PRIV \
$KUBE_SERVICE_ADDRESSES \
$KUBE_ADMISSION_CONTROL \
$KUBE_API_ARGS
Restart=on-failure
Type=notify
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
#启动服务
systemctl daemon-reload
systemctl enable kube-apiserver
systemctl start kube-apiserver
systemctl status -l kube-apiserver
systemctl restart kube-apiserver
systemctl stop kube-apiserver
# 安装 controller-manager
vim /etc/kubernetes/controller-manager
# cluster-name 集群名 root-ca-file CA 根证书
KUBE_CONTROLLER_MANAGER_ARGS=”–cloud-provider=” –enable-garbage-collector=true –terminated-pod-gc-threshold=5 –address=127.0.0.1 –service-cluster-ip-range=169.169.0.0/16 –cluster-cidr=172.17.0.0/16 –root-ca-file=/home/sharefiles/ssl/ca.pem –service-account-private-key-file=/home/sharefiles/ssl/kubernetes-key.pem –kubeconfig=/etc/kubernetes/kubeconfig”
vim /usr/lib/systemd/system/kube-controller-manager.service
[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=kube-apiserver.service
Requires=kube-apiserver.service
[Service]
EnvironmentFile=/etc/kubernetes/config
EnvironmentFile=/etc/kubernetes/controller-manager
ExecStart=/usr/local/bin/kube-controller-manager \
$KUBE_LOGTOSTDERR \
$KUBE_LOG_LEVEL \
$KUBE_LOG_DIR \
$KUBE_MASTER \
$KUBE_CONTROLLER_MANAGER_ARGS
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable kube-controller-manager
systemctl start kube-controller-manager
systemctl status -l kube-controller-manager
systemctl restart kube-controller-manager
systemctl stop kube-controller-manager
# 安装 kube-scheduler
vim /etc/kubernetes/scheduler
KUBE_SCHEDULER_ARGS=”–address=127.0.0.1 –kubeconfig=/etc/kubernetes/kubeconfig”
vim /usr/lib/systemd/system/kube-scheduler.service
[Unit]
Description=Kubernetes Scheduler Plugin
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=kube-apiserver.service
Requires=kube-apiserver.service
[Service]
EnvironmentFile=/etc/kubernetes/config
EnvironmentFile=/etc/kubernetes/scheduler
ExecStart=/usr/local/bin/kube-scheduler \
$KUBE_LOGTOSTDERR \
$KUBE_LOG_LEVEL \
$KUBE_LOG_DIR \
$KUBE_MASTER \
$KUBE_SCHEDULER_ARGS
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable kube-scheduler
systemctl start kube-scheduler
systemctl status -l kube-scheduler
systemctl restart kube-scheduler
systemctl stop kube-scheduler
# 配置 kubectl
cd ~/.kube/
vim config
current-context: kube-context
apiVersion: v1
kind: Config
users:
– name: controllermanager
user:
client-certificate: /root/ssl/apiserver.pem
client-key: /root/ssl/apiserver-key.pem
clusters:
– name: kubernetes
cluster:
certificate-authority: /root/ssl/ca.pem
server: https://10.29.167.233:6443
contexts:
– context:
cluster: kubernetes
user: controllermanager
name: kube-context
#或使用命令行配置 config
# 设置集群参数
kubectl config set-cluster kubernetes \
–certificate-authority=/home/sharefiles/ssl/ca.pem \
–embed-certs=true \
–server=https://10.29.167.233:6443
# 设置客户端认证参数
kubectl config set-credentials controllermanager \
–client-certificate=/home/sharefiles/ssl/apiserver.pem \
–embed-certs=true \
–client-key=/home/sharefiles/ssl/apiserver-key.pem
# 设置上下文参数
kubectl config set-context kube-context \
–cluster=kubernetes \
–user=controllermanager
# 设置默认上下文
kubectl config use-context kube-context
#验证 master 节点
kubectl –server=https://10.29.167.233:6443 –certificate-authority=/home/sharefiles/ssl/ca.pem \
–client-certificate=/home/sharefiles/ssl/apiserver.pem \
–client-key=/home/sharefiles/ssl/apiserver-key.pem \
get cs
或
kubectl get cs
#node 节点安装
创建工作目录
mkdir /var/lib/kubelet
修改主机名 centos7
vim /etc/cloud/cloud.cfg 将
preserve_hostname=fale 改为
preserve_hostname=true
hostnamectl set-hostname node_246 重新登录即可
yum install conntrack-tools
vim /etc/kubernetes/kubelet
###
## kubernetes kubelet (minion) config
#
## The address for the info server to serve on (set to 0.0.0.0 or “” for all interfaces)
KUBELET_ADDRESS=”–address=10.29.168.24″
#
## 本节点在集群中的名字 10.29.167.186
KUBELET_HOSTNAME=”–hostname-override=10.29.168.24″
#
## api-server 服务地址
KUBELET_API_SERVER=”–api-servers=https://10.29.167.233:6443″
#
## pod 基础 pause 镜像
KUBELET_POD_INFRA_CONTAINER=”–pod-infra-container-image=registry.cn-shenzhen.aliyuncs.com/gcrio/pause-amd64:3.0″
#
## Add your own!
#–cluster-dns 指定 kubedns 的 Service IP(可以先分配,后续创建 kubedns 服务时指定该 IP),
#–cluster-domain 指定域名后缀,这两个参数同时指定后才会生效
#–root-dir 运行根目录 保存 pod 和 volume 的文件
KUBELET_ARGS=”–cloud-provider=” –cluster-dns=169.169.1.1 –root-dir=/var/lib/kubelet –cluster-domain=cluster.local –serialize-image-pulls=false –kubeconfig=/etc/kubernetes/kubeconfig –hairpin-mode=promiscuous-bridge”
vim /usr/lib/systemd/system/kubelet.service
[Unit]
Description=Kubernetes Kubelet Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=docker.service
Requires=docker.service
[Service]
WorkingDirectory=/var/lib/kubelet
EnvironmentFile=/etc/kubernetes/config
EnvironmentFile=/etc/kubernetes/kubelet
ExecStart=/usr/local/bin/kubelet \
$KUBE_LOGTOSTDERR \
$KUBE_LOG_LEVEL \
$KUBE_LOG_DIR \
$KUBELET_API_SERVER \
$KUBELET_ADDRESS \
$KUBELET_HOSTNAME \
$KUBE_ALLOW_PRIV \
$KUBELET_POD_INFRA_CONTAINER \
$KUBELET_ARGS
Restart=on-failure
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable kubelet
systemctl start kubelet
systemctl status -l kubelet
systemctl stop kubelet
systemctl restart kubelet
# 安装 kube-proxy
vim /etc/kubernetes/proxy
#–hostname-override 参数值必须与 kubelet 的值一致
#kube-proxy 根据 –cluster-cidr 判断集群内部和外部流量 pod 的地址范围,用于桥接集群外部流量到内部,
#snat IP 地址转换,将内网向外网发出的包的内网源地址改成可以被外网访问到的 ip 地址,方便外网的请求可以请求到内网
KUBE_PROXY_ARGS=”–bind-address=10.29.168.24 –hostname-override=10.29.168.24 –cluster-cidr=172.17.0.0/16 –kubeconfig=/etc/kubernetes/kubeconfig”
vim /usr/lib/systemd/system/kube-proxy.service
[Unit]
Description=Kubernetes Kube-Proxy Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target
Requires=network.service
[Service]
EnvironmentFile=/etc/kubernetes/config
EnvironmentFile=/etc/kubernetes/proxy
ExecStart=/usr/local/bin/kube-proxy \
$KUBE_LOGTOSTDERR \
$KUBE_LOG_LEVEL \
$KUBE_LOG_DIR \
$KUBE_MASTER \
$KUBE_PROXY_ARGS
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
# 启动服务
systemctl daemon-reload
systemctl enable kube-proxy
systemctl start kube-proxy
systemctl status -l kube-proxy
systemctl stop kube-proxy
systemctl restart kube-proxy
# 检查节点
kubectl get nodes
# 测试
kubectl run nginx –replicas=2 –labels=”run=load-balancer-example” –image=nginx:1.11.13 –port=80
kubectl expose deployment nginx –type=NodePort –name=example-service
kubectl describe svc example-service
# 访问主节点所有从节点的主机端口都应该能访问到 nginx,以及访问 pod 服务虚拟 IP 也应该能访问到 nginx
curl “121.42.248.198:30101”
“`
Node 安装 Docker 引擎
Node 安装 kubelet、kube-proxy
Master 安装私有 Docker 镜像仓库
获取 kubeguide/google_containers/pause-amd64:3.0 镜像提交到私有仓库,此仓库是创建 Pod 使用的
Node 配置 kubelet 启动参数 –pod_infra_container_image=kubeguide/google_containers/pause-amd64:3.0 使用私有仓库地址为 pause 镜像地址。
集群网络配置。多 Node 节点网络互通是底层配置,与 Kubernetes 无关需要自行配置
flannel 覆盖网络,官方推荐。封装了数据包,会降低性能。需要安装 etcd
直接路由:性能最好设置简单,就是多台 Node 节点配置静态路由转发规则较为繁琐,可以使用 quagga 管理。需要规划每台 Node 节点 docker0 网卡子网 IP 段不能相互冲突重复。重启服务器时,Docker0 地址会变化需要设置固定值,阿里云网络不支持路由配置
sudo ifconfig docker0 172.17.0.254/24 master 主机 ifconfig 配置重启之后就会还原,需要使用 bip 绑定 ip 参数
sudo ifconfig docker0 172.17.1.254/24 /24 表示 24 个 1 8 个 0 表示此子网段可以有 256 台主机
sudo ifconfig docker0 172.17.2.254/24 254 为节点主机 Docker0 网卡的 IP 地址。172.17.2.1-253 都是一个子网的
…. 可以一直到 172.17.254.254/24
sudo systemctl restart docker #重启
#在主机 master 上添加路由
sudo route add -net 172.17.1.0 netmask 255.255.255.0 gw 节点主机 1 的内网 IP
sudo route add -net 172.17.2.0 netmask 255.255.255.0 gw 节点主机 2 的内网 IP
#在节点主机 1 上 添加路由
sudo route add -net 172.17.0.0 netmask 255.255.255.0 gw master 主机的内网 IP
sudo route add -net 172.17.2.0 netmask 255.255.255.0 gw 节点主机 2 的内网 IP
# 不在同一网段 先将网关 IP 当成一个主机加进来,这样在这两个 IP 直接建立一个连接, 并且不设置掩码,即能到达所有其他网段。
route add -host 202.194.20.254 netmask 0.0.0.0 dev eth0
#然后再将网关 IP 加成网关
route add default gw 202.194.20.254 netmask 0.0.0.0 dev eth0
#查看路由
route -n
#删除路由记录
route del -net 172.17.1.0/24 或
route del -net 172.17.1.0 netmask 255.255.255.0
#删除默认网关记录
route del default gw 192.168.120.240
#跟踪路由跳转
traceroute 172.17.0.1
使用 Calico 网络插件:插件中性能最好,创建路由表形式,在同一个子网中,通过路由方式转发数据包,无性能损耗,在不同子网中,需要隧道,有性能损耗。但同样阿里云网络不支持路由修改;
使用阿里云的 vps 专用高速网络:配置一个大的自定义的局域网。用的也是隧道技术覆盖网络
DNS 服务 skydns 安装
安装 etcd
kube2sky 时刻调取 apiserver 的 API 获取集群中所有服务的信息,并将 service 服务写入 etcd
skyDns 解析 DNS 域名
healthz 健康检查
将启动四个容器放在一个 pod 中,
skydns 的 pod 虚拟 clusterIP 地址必须是固定的,不能通过系统自动分配需要在 server 服务配置文件中使用 clusterIP:选项配置,并在 apiserver 的指定 ip 地址范围。
再修改每台 Node 上 kubelet 启动参数配置 DNS 服务的固定 IP 地址及域名
之后通过服务名:端口号即可找到对应服务。不再担心服务重启后 IP 地址变更的问题
每台 Node 的 kubelet 服务会去访问 DNS 服务,得到解析域名之后的对应 IP 地址再去访问服务
1.4 版本 DNS 服务
kubedns 容器
监视 k8s Service 资源并更新 DNS 记录
替换 etcd,使用 TreeCache 数据结构保存 DNS 记录并实现 SkyDNS 的 Backend 接口
接入 SkyDNS,对 dnsmasq 提供 DNS 查询服务
dnsmasq 容器
对集群提供 DNS 查询服务
设置 kubedns 为 upstream
提供 DNS 缓存,降低 kubedns 负载,提高性能
exechealthz 容器
定期检查 kubedns 和 dnsmasq 的健康状态
为 k8s 活性检测提供 HTTP API
对比 1.2 版改进
无状态服务。1.2 版本中,需要将 Etcd 的数据 Volume 出来才能保证 Etcd 容器重启之后数据不会丢失,服务可以快速恢复。新版本中作为无状态服务出现,通过增加冗余来提高可靠性。即使 kubedns 容器重启,dnsmasq 缓存机制也可以保证服务的可用性。
优化查询效率。SkyDNS 直接从内存中获取 DNS 记录。
完善健康检查。1.2 版本中只对 kube2sky 设置了健康检查
不足,内存占用问题,默认设置了内存限制为 170M,大规模集群中使用未验证
安装
mkdir -p /home/kube_yaml/kubedns/
cd kubernetes/cluster/addons/dns/
cp kubedns-sa.yaml /home/kube_yaml/kubedns 修改 namespace: kube-system
cp kubedns-cm.yaml /home/kube_yaml/kubedns 无需修改 ConfigMap
cp kubedns-svc.yaml.base /home/kube_yaml/kubedns/kubedns-svc.yaml
替换 clusterIP: __PILLAR__DNS__SERVER__ 为 clusterIP: 169.169.1.1 和 kubelet 的 –cluster-dns 参数值一致;
cp kubedns-controller.yaml.base /home/kube_yaml/kubedns/kubedns-controller.yaml
修改所有镜像地址为本地私有仓库
dudureg.xip.io:5000/k8s-dns-dnsmasq-nanny-amd64:1.14.1
dudureg.xip.io:5000/k8s-dns-kube-dns-amd64:1.14.1
dudureg.xip.io:5000/k8s-dns-sidecar-amd64:1.14.1
替换所有__PILLAR__DNS__DOMAIN__ 为 cluster.local 如:– domain=cluster.local. 域名
#__PILLAR__FEDERATIONS__DOMAIN__MAP__ 注释
#创建所有资源 kubedns-cm.yaml kubedns-controller.yaml kubedns-sa.yaml kubedns-svc.yaml
kubectl create -f .
#系统预定义的 RoleBinding system:kube-dns 将 kube-system 命名空间的 kube-dns ServiceAccount 与 system:kube-dns Role 绑定,该 Role 具有访问 kube-apiserver DNS 相关 API 的权限;
查看命令 kubectl get clusterrolebindings system:kube-dns -o yaml
kubedns-controller.yaml 中定义的 Pods 时使用了 kubedns-sa.yaml 文件定义的 kube-dns ServiceAccount,所以具有访问 kube-apiserver DNS 相关 API 的权限。
获取有密码账号验证的私有镜像仓库的镜像
Pods 只能在其自己的命名空间中引用图像拉取秘密,因此每个命名空间需要执行一次此过程。
kubectl create secret docker-registry regsecret –docker-server=dudureg.ziseyiliao.com:5000 –docker-username=duduyisheng –docker-password=duducode –docker-email=tongxingsheng@ziseyiliao.com
查看
kubectl get secret regsecret –output=yaml
在 Pod 中使用
imagePullSecrets:
也可以不设置私有仓库账号密码
#测试
mkdir -p /home/kube_yaml/test && cd /home/kube_yaml/test
cat << EOF > test-nginx.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: test-nginx
spec:
replicas: 2
template:
metadata:
labels:
run: test-nginx
spec:
containers:
– name: test-nginx
image: dudureg.xip.io:5000/nginx:1.11.13
ports:
– containerPort: 80
EOF
kubectl create -f test-nginx.yaml
kubectl expose deploy test-nginx
kubectl get services –all-namespaces |grep test-nginx
kubectl –namespace=kube-system describe service/kube-dns
#dns 组件可以为 k8s 集群内的 service 做 dns 解析
#进入一个 pod
docker exec -ti k8s_test-nginx_test-nginx-218109665-j3h5z_default_83630203-28b4-11e7-a447-00163e05ddb0_0 /bin/bash
#查看
cat /etc/resolv.conf
3#ping 域名 都不能 ping 通,但都有对应解析地址就是成功
ping test-nginx
ping kubernetes
ping kube-dns.kube-system.svc.cluster.local
#使用
my-svc.my-namespace.svc.cluster.local A 记录服务域名
my-svc 为服务名 my-namespace 为命名空间默认空间为 default。svc.cluster.local 为域名
pod-ip-address.my-namespace.pod.cluster.local A 记录 Pod 域名
pod-ip-address 为 pod 的 ip 地址 my-namespace 为命名空间默认空间为 default。pod.cluster.local 为 pod 域名
“`
安装配置 UI
官方 yaml 配置在 kubernetes/cluster/addons/dashboard 目录
dashboard-service.yaml 无修改;
dashboard-controller.yaml 修改镜像地址 image=dudureg.xip.io:5000/kubernetes-dashboard-amd64:v1.6.0
kubectl get services kubernetes-dashboard -n kube-system 查看服务
kubectl get deployment kubernetes-dashboard -n kube-system
kubectl get pods -n kube-system | grep dashboard
访问方式 IP 加端口号;kube-apiserver 接口访问;代理访问 kubectl proxy
kubectl proxy –address=’172.20.0.113′ –port=8086 –accept-hosts=’^*$’ 启动代理
kubectl cluster-info 获取集群服务地址
集群配置 CA 签名双向数字证书认证(可选)
所有对 apiserver 的访问,都是用安全方式 https 端口 443,并且可以对外网提供服务
在安全的内网可以使用非安全的访问模式,默认也是非安全模式
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj “/CN=$NGROK_DOMAIN” -days 3650 -out rootCA.pem
openssl genrsa -out device.key 2048
basic_auth.csv – 基本的用户和密码 ca.crt – 证书颁发机构证书 known_tokens.csv – 令实体(例如,kubelet)可以用来与 apiserver 通信 kubecfg.crt – 客户端证书,公钥 kubecfg.key – 客户端证书,私钥 server.cert – 服务器证书,公钥 server.key – 服务器证书,私钥
集群外部访问集群内 Pod 或 Service
设置 Pod 将容器端口映射到物理机端口上,通过物理机 IP 加端口号访问
设置 Service 将服务端口号映射到物理机端口上,通过物理机 IP 加端口号访问
直接访问 apiserver
需要 apiserver 配置 –bind-address=0.0.0.0
将证书转换格式
openssl pkcs12 -export -in apiserver.pem -out apiserver.p12 -inkey apiserver-key.pem
在转换过程中可以配置一个密码,tongxingsheng123,再导入的时候需要使用这个密码
就可以使用主机 IP 地址加 6443 安全端口号访问
获取访问路径
kubectl cluster-info
Kubernetes master is running at https://121.42.248.198:6443
Kibana is running at https://121.42.248.198:6443/api/v1/proxy/namespaces/kube-system/services/kibana-logging
KubeDNS is running at https://121.42.248.198:6443/api/v1/proxy/namespaces/kube-system/services/kube-dns
kubernetes-dashboard is running at https://121.42.248.198:6443/api/v1/proxy/namespaces/kube-system/services/kubernetes-dashboard
monitoring-grafana is running at https://121.42.248.198:6443/api/v1/proxy/namespaces/kube-system/services/monitoring-grafana
二进制安装
cp -r server/bin/{kube-apiserver,kube-controller-manager,kube-scheduler,kubectl,kube-proxy,kubelet} /root/local/bin/
常用操作命令
kubectl 命令格式为 kubectl 子命令 资源类型 资源名 参数 -o= 输出日志格式
可操作的常用资源类型有:
deployments、rc 副本控制
events 事件
endpoints
hpa 横向扩展
nodes 节点
namespaces 命名空间
pods
pv 数据卷
services 服务
常用子命令:
apply 从配置文件对资源更新
cordon 将 node 隔离出集群调度
create 从配置文件中创建资源对象
delete 从配置文件资源名或标签选择器删除资源对象
describe 描述资源对象的详细信息
drain 隔离 node 节点并删除上面的所有 pod
exec pod 名 -c 容器名 命令:在指定容器中执行命令
get 显示资源对象概要信息
logs 在屏幕打印一个容器的日志
rolling-update 对 RC 进行滚动升级
scale 扩容缩容 pod 的数量
set 修改容器的镜像
label 设置或更改资源对象的标签
输出日志格式(可选参数)json、yaml、wide 额外信息
kubectl create -f 资源定义文件.yaml 创建资源,pod、server、deployment、RC
kubectl get rc 查看创建的 RC 文件
kubectl get pods 查看所有创建的 pod
kubectl describe pod pod 的名字 查看具体某一个 pod 的信息
kubectl get nodes 查看集群中的 node
kubectl describe noe node 的名字 查看具体某一个 node 的信息,Ready 状态表示正常
kubectl get deployments 查看所有创建的 deployments
kubectl describe deployments 查看具体 deployments 控制的 pod 扩展过程
kubectl scale rc php-slave –replicas=3 手动实现 pod 扩容缩容
kubectl get endpoints 查看服务的端点 Pod 列表
kubectl exec -ti pod 名 /bin/bash 登录指定容器 /bin/ash
kubectl logs pod 名 查看容器日志
kubectl logs -f pod 名 -c 容器名 跟踪查看指定容器日志
kubectl describe configmap 配置名 查看配置信息
配置
Pod 资源完整定义, 推荐不要直接创建 Pod,而是通过 RC 的模板定义 Pod。哪怕只用到一个 Pod 副本,也强烈建议使用 RC 来定义
apiVersion: v1 #版本号
kind: Pod # kind 定义这个一个 pod 资源
metadata:
name: myweb #定义 pod 名字
namespace: string #命名空间
labels: #定义标签
name:myweb
spec: #定义 pod 里容器属性
containers:
– name: myweb #定义容器名
image: kuberguide/tomcat-app:v1 #定义容器使用镜像
imagePullPolicy:[Always|Never|IfNotPresent]每次都重新下载镜像 | 仅使用本地镜像 | 先使用本地镜像,不存在再下载镜像。默认每次重新下载镜像 Always
command:[string] #容器启动命令列表
args:[string]# 容器启动命令参数列表
workingDir:string #容器工作目录
volumeMounts: #挂载到容器的存储卷
– name: string #使用 pod 定义的共享存储卷名称
mountPath:string 存储卷在容器内挂载的绝对路径,应少于 512 字符
ports: #定义容器开放暴露的端口号列表
– containerPort: 8080 #定义 pod 对外开放的服务端口号,容器要监听的端口
env: #定义容器变量列表
– name: MYSQL_SERVICE_HOST
value: ‘mysql’
resources: #资源限制设置
limits:
cpu: string #容器启动后最多可用 CPU 核数。
memory:string #容器启动最多可用内存数 单位 MiB、GiB
requests:# 最低启动限制设置
cpu: string #最低容器启动可用 CPU 核数。
memory:string #最低容器启动可用内存数 单位 MiB、GiB
restartPolicy:[Always|Never|OnFailure]#pod 重启策略,一旦终止立即重启 | 终止后报告错误后不再重启 | 只有非 0 错误码终止才重启其他不重启。默认 Always
nodeSelector: #设置调度 pod 到指定这里配置的 labe 的 Node 上
标签 key: 标签 value
imagePullSecrets: #拉取镜像时使用的秘钥信息
– key:string
volumes: #pod 的共享存储卷列表
– name: string #存储卷名,唯一
emptyDir:{} #存储卷类型,生命周期和 pod 相同,临时目录
hostPath: #存储卷类型,表示从宿主机目录上挂载
path: string #使用的宿主机目录
secret: #存储卷类型。
secretName: string
items:
– key: string
path: stirng
configMap: #存储卷类型
name: string
items:
– key: string
path: sting
livenessProbe: #Pod 内容器健康检查设置,无响应之后自动重启该容器
exec: #检查类型,仅需使用其中一种。
command:[string] #命令或脚本
httpGet: #检查类型,仅需使用其中一种。
path: string
port: number
host: string
scheme: string
httpHeaders:
– name: string
value: string
tcpSocket: #检查类型,仅需使用其中一种
port: number
initialDelaySeconds:0 #容器重启完成后,首次探测的间隔时间单位秒
timeoutSeconds:0 #容器探测等待响应超时时间,单位秒。默认 1 秒,超时认为不健康重启
periodSeconds:0 #容器探测间隔时间,单位秒,默认 10 秒。
successThreshold:0
failureThreshold:0
securityContext:
privileged: false
* Service 服务资源完整定义
apiVersion: v1 kind: Service metadata: #元数据
name: string #服务名
namespace:string #命名空间
labels:
– name: string #标签列表
spec:
selector: [] #标签选择器
type: string #服务访问方式默认 ClusterIP 访问、NodePort 使用宿主机端口、
clusterIP: string #指定服务 IP 地址,不指定系统分配
sessionAffinity: ClientIP #是否支持 session 默认为空轮询负载,ClientIP 模式同一个客户端 IP 请求发到同一 pod
ports: #服务开放的端口列表
– name: string #端口名
protocol: string #端口协议 默认 TCP 可选 UDP
port: int #服务监听端口号
targetPort: int #转发到后端 Pod 端口号
nodePort: int #映射到宿主机的端口号
status: #外部均衡器设置
loadBalancer:
ingress:
ip: string
hostname: string
* RC 副本控制资源完整定义
* 确保集群中 Pod 数量就是 RC 定义中的数量
* 通过 RC 中的 replicas 属性来实现系统扩容和缩容
* 通过改变 RC 中的 Pod 模板主要是镜像版本,实现系统的滚动升级
apiVersion: v1
kind: ReplicationController
metadata:
name: mysql
spec:
replicas: 1 #副本数量
selector:
name: mysql-pod
template:
metadata:
labels:
name: mysql-pod
spec:
containers:
– name: php-redis
image: redis
env:
– name: HOSTS
value: 1111
ports:
– containerPort: 90
…….
“`
Secret 私密凭据资源完整定义
存放私密数据,如密码;OAuth TOken、ssh keys
使用:在 Docker 镜像下载时使用:指定 Pod 的 ImagePullSecrets 来引用
挂载该 secret 到 Pod 来使用,然后访问目录中的文件来获取数据
在 pod 创建时,为 pod 指定 ServiceAccount 来自动使用该 secret
在更新 Secret 之后,需要删除旧的 Pod,再创建一个新的 Pod,更新 secret 的流程和部署一个新的 image 是一样的
apiVersion: v1
kind: Secret
metadata:
name: my_secret
type: Opaque
data:
password: 1111
username: 2222
—
kind:pod
…..
volumes:
– name: foo
secret:
……
—-
kind:pod
spec:
containers:
– name: foo
image: redis
imagePullSecrets:
– name: my_registrykey #拉取镜像使用
“`
要求:
Master:至少 1 核、2G 内存;推荐 2 核、4G 内存,
谷歌推荐管理 1 - 5 个 node 节点服务器配置 1cpu 4G 内存 6-10node 2cpu 8G 内存 11-100node 4cpu 15G 内存 101-250node 8CPU 30G 内存
Node:至少 1 核、2G 内存;推荐安装需要运行的容器数量进行调整
内核系统要求:3.10 以上、64 位系统、如 CentOS7、RedHat7
Docker 要求:至少 1.9 以上;推荐 1.12,目前最新 1.13 也就是 17.03.1-ce 这版
etcd 要求:至少 2.0 以上;推荐 3.0.7 版本
功能
kubeconfig 文件
https://kubernetes.io/docs/co…
使用命令修改添加配置集群选项 kubectl config set-cluster 选项
使用命令修改用户部分选项 kubectl config set-credentials
使用命令修改上下文部分 kubectl config set-context
使用命令查看当前加载的配置 kubectl config view
分为集群部分、用户部分、上下文部分
current-context: federal-context
apiVersion: v1
clusters:
– cluster:
api-version: v1
server: http://cow.org:8080
name: cow-cluster
– cluster:
certificate-authority: path/to/my/cafile
server: https://horse.org:4443
name: horse-cluster
– cluster:
insecure-skip-tls-verify: true
server: https://pig.org:443
contexts:
context:
cluster: horse-cluster
namespace: chisel-ns
user: green-user
name: federal-context
context:
cluster: pig-cluster
namespace: saw-ns
user: black-user
name: queen-anne-context
kind: Config users:
name: blue-useruser: token: blue-token
name: green-useruser: client-certificate: path/to/my/client/cert client-key: path/to/my/client/key
默认主机 Master 的 apiserver 服务监听 8080 端口提供 REST 服务
Node 的隔离和恢复
在升级 Node 硬件或维护的情况下,将 Node 隔离,脱离 Kubernetes 的调度范围:
脱离之后,系统不会在该 nod 上创建 pod,但已经创建运行的 pod 不会自动停止,需要手动停止
apiVersion: v1 kind: Node metadata:
name:k8s-node-1
labels:
hostname: k8s-node-1
spec:
unschedulable: true #表示脱离调度,设置 false 表示恢复调度
# 完成修改命令 kubectl replace -f unschedule node.yaml #查看 node 状态,会有所变化 kubectl get nodes
* 通过命令操作:
* kubectl cordon k8s-node-1 隔离
* kubectl uncordon k8s-node-1 恢复
### Node 扩容,加入新 node 节点
* 使用 ansible 安装 node 组件和 docker
### 集群环境分组隔离
* 如开发环境、生产环境、测试环境、试错环境、第三方开放服务环境、管理后台环境、内部不同业务组紫色医疗和嘟嘟医生,都可以在一个 kubernetes 集群中,在不同空间,资源隔离互不影响
* 创建对应命名空间 kubectl create -f namespace-test.yaml
apiVersion: v1 kind: Namespace metadata:
name: development
— apiVersion: v1 kind: Namespace metadata:
name: test
# 查看命名空间 kubectl get namespaces
* 命令行创建命名空间 kubectl create namespace test
* 定义运行环境 Context,为每个命名空间定义一个运行环境
#定义集群 kubectl config set-cluster kubernetes-cluster –server=https://192.168.1.128.8080 #定义开发环境的运行环境名、使用的命名空间、使用的集群、kubectl config set-cluster ctx-dev –namespace=development –cluster=kubernetes-cluster –user=dev #定义测试环境的运行环境名、使用的命名空间、使用的集群、kubectl config set-cluster ctx-test –namespace=test –cluster=kubernetes-cluster –user=test
#查看定义的运行环境 Context kubectl config view
* 切换当前运行环境,切换之后操作创建的资源都在对应分组环境下,互不干扰
kubectl Config use-context ctx-dev 或切换测试环境 kubectl Config use-context ctx-test
### 全局 cpu 内存资源管理配置 limitRange
* 默认不设置资源限制,pod 中的容器会无限制使用内存和 cpu。
* 通过 Pod 中的资源限制可以限制每一个容器使用的内存 cpu。但设置每一个 pod 比较繁琐。可以全局配置统一
* 可以一次限制一个命名空间运行环境下所有容器的最大使用 cpu 和内存数,给每个不同空间分组不同资源数。
apiVersion: v1 kind: LimitRange metadata:
name: my_limits
spec:
limits:
– max:# 是 pod 中所有容器的最高上限的总和,一个 pod 所有容器加起来不能超过
cpu: “4”
memory: 2Gi
min: #是 pod 中所有容器的最低下限的总和,一个 pod 所有容器加起来不能少于
cpu: 50m
memory: 100Mi
maxLimitRequestRatio: #限制 pod 中所有容器的 limits 值总和和 requests 值总和的比例上限
cpu: 3
memory: 2
type: pod
– default: #pod 中所有未指定限制的容器的上限,值要小于等于 max 配置的
cpu: 300m
memory: 200Mi
defaultRequest: #Pod 中所有未指定限制的容器的下限,只要小于等于 default
cpu: 200m
memory:100Mi
max: #pod 中所有容器的上限,
cpu: “2”
memory: 1Gi
min: #pod 中所有容器的下限,值要小于等于 defaultRequest 配置的
cpu: 100m
memory: 3Mi
maxLimitRequestRatio: #限制 pod 中所有容器的 limits 值和 requests 值的比例上限
cpu: 5
memory: 4
type: Container
#在使用的命名空间分组创建全局配置 kubectl create -f limits.yaml –namespace=limit-example #在使用命名空间分组中查看全局限制配置 kubectl describe limits my_limits –namespace=limit-example
### pod 服务可靠性
* 一个 pod 中所有容器都设置了资源限制。并所有容器的 Limits 值和 Requests 值全部相等不为 0
* 这样的 Pod 服务在整个集群中是完全可靠的。在资源不够的情况下,最最后才会被杀掉进程释放资源
* 关键服务需要这样的设置,保证服务可靠性
### Etcd 服务高可用
* 部署成为集群形式,存储数据使用高可用的存储设备,备份保存,如阿里 OSS
* kube-apiserver 启动参数配置 etcd。使用内网 IP
* –etcd-servers=http://10.0.0.1:2379,http://10.0.0.1:2380,http://10.0.0.1:2381,
* 可以部署在同一个服务器上,启动不同端口号;
* 可以部署在 docker 中,启动多个容器,使用宿主机的端口;方便之后扩展以及升级
* 可以部署在不同服务器上,不同 IP,相同端口号;
* 可以只部署一个服务,使用守护进程监控,挂机自动重启。
### Master 高可用
* 由于系统不支持多个 Master 的配置和 etcd 不同,所以集群部署方式需要使用负载均衡。
* kube-apiserver、kub-controller-manager、kube-scheduler 安装在不同服务器中,需要负载均衡 haproxy 和 keepalived 健康监控。访问 kube-apiserver 需要使用负载均衡的地址。另外两个组件需要配置 –leader-elect=true 配置选举出 leader。部署在多台服务器中
* 部署在一台服务器中,使用守护进程监控。
* 部署在一台服务器中,使用容器启动,使用宿主机端口。方便之后扩展以及升级
## 集群监控 cAdvisor + Heapster + Influxdb + Grafana
* http://grafana.org
* http://influxdb.com
* https://github.com/google/cadvisor
* https://github.com/kubernetes/heapster/releases 下载最新版 Heapster
* 集群默认集成 cAdvisor 监控容器的运行状态。采集 node 性能指标以及 node 上运行的容器性能指标
* kubelet 启动时自动启动 cAdvisor 服务。在每台 Node 中运行,单独监控单个 Node。对外服务端口号作为 web 页面查看:4194。访问每个 nodeIp 地址:4194 端口
* cAdvisor + Heapster + Influxdb + Grafana:集群所有容器 Node 节点监控。
* Heapster:访问每台 Node 中 cAdvisor 的 api 接口获取数据汇总保存到 Influxdb。
* Influxdb:分布式时序数据库,每条记录带有时间戳。用于实时的数据采集,事件跟踪,存储时间图表,原始数据。
* Grafana:通过 web 界面将 Influxdb 中的时序数据展现成图表
* 安装部署:使用 Pod 部署,创建 3 个服务,Influxdb + Grafana 创建在同一个 Pod 中,Heapster 在一个 Pod 中
* Heapster 服务 + Influxdb 服务都在同一个命名空间中 kube-system,不需要区分用户分组
* Influxdb 服务可以通过主机端口号提供访问,通过 web 界面查看数据
* Grafana 服务可以通过 Master 的代理模式访问
* Heapster 需要和 Master 进行安全连接,需要设置 CA 证书安全模式
* 安装
wget https://github.com/kubernetes… unzip v1.3.0.zip mv v1.3.0.zip heapster-1.3.0 cd heapster-1.3.0/deploy/kube-config/influxdb
grafana-deployment.yaml 配置 修改 image=dudureg.xip.io:5000/heapster-grafana-amd64:v4.0.2 开启 value: /api/v1/proxy/namespaces/kube-system/services/monitoring-grafana/ 注释 #value:/ 为了后续使用 kube-apiserver 或者 kubectl proxy 访问 grafana dashboard
heapster-deployment 配置 修改 image=dudureg.xip.io:5000/heapster-amd64:v1.3.0
influxdb-deployment 配置 修改 image=dudureg.xip.io:5000/heapster-influxdb-amd64:v1.1.1 修改 数据卷 # emptyDir: {} hostPath:
path: home/nfs/influxdb_db
时区配置 volumeMounts:
– name: tz-config
mountPath: /etc/localtime
volumes:
– name: tz-config
hostPath:
path: /usr/share/zoneinfo/Asia/Shanghai
创建所有资源 kubectl create -f . 检查 kubectl get deployments -n kube-system | grep -E ‘heapster|monitoring’ 检查 pods kubectl get pods -n kube-system | grep -E ‘heapster|monitoring’ 查看 api 服务请求地址 kubectl cluster-info monitoring-grafana is running at https://10.29.167.233:6443/api/v1/proxy/namespaces/kube-system/services/monitoring-grafana monitoring-influxdb is running at https://10.29.167.233:6443/api/v1/proxy/namespaces/kube-system/services/monitoring-influxdb 创建代理访问 kubectl proxy –address=’121.42.248.198′ –port=8086 –accept-hosts=’^*$’ 浏览器访问 http://121.42.248.198:8086/api/v1/proxy/namespaces/kube-system/services/monitoring-grafana
### 集群日志 Fluentd + ElasticSearch + Kibana
* 需要配置 CA 证书安全模式、需要 DNS 服务
* 服务运行在命名空间 kube-system 中
* 容器中服务的日志集中输出到 Node 主机指定目录下
* Fluentd:在每个 Node 中运行一个容器,针对 Node 中的日志目录采集日志,保存到 ElasticSearch
* ElasticSearch:保存数据以及索引,需要集群模式分担负载。
* 安装部署:DaemonSet 模式在每台 Node 中启动 Fluentd 服务 Pod 容器
* 每个组件都创建自己的 rc 和服务。使用 kubectl cluster-info 查看服务地址,使用 kubectl proxy 命令代理启动访问服务
* 安装
cd /home/kubernetes/cluster/addons/fluentd-elasticsearch
es-controller.yaml 配置 修改 image:dudureg.xip.io:5000/elasticsearch:v2.4.1-2 修改 数据卷 # emptyDir: {} hostPath:
path: /home/nfs/elasticsearch_db
fluentd-es-ds.yaml 配置 修改 image:dudureg.xip.io:5000/fluentd-elasticsearch:1.22 kibana-controller.yaml 配置 修改 image:dudureg.xip.io:5000/kibana:v4.6.1-1
时区配置 volumeMounts:
– name: tz-config
mountPath: /etc/localtime
volumes:
– name: tz-config
hostPath:
path: /usr/share/zoneinfo/Asia/Shanghai
查看节点 kubectl get nodes 给节点服务器打标签 kubectl label nodes 10.29.168.24 beta.kubernetes.io/fluentd-ds-ready=true kubectl label nodes 10.29.167.186 beta.kubernetes.io/fluentd-ds-ready=true 定义 DaemonSet fluentd-es-v1.22 时设置了 nodeSelector beta.kubernetes.io/fluentd-ds-ready=true,所以需要在期望运行 fluentd 的 Node 上设置该标签 创建资源 kubectl create -f .
查看 kubectl get deployment -n kube-system|grep kibana kubectl get pods -n kube-system|grep -E ‘elasticsearch|fluentd|kibana’ kubectl get service -n kube-system|grep -E ‘elasticsearch|kibana’
kibana Pod 第一次启动时会用较长时间 (10-20 分钟) 来优化和 Cache 状态页面,可以 tailf 该 Pod 的日志观察进度:kubectl logs kibana-logging-3358050253-xpwpz -n kube-system -f
api 服务访问 kubectl cluster-info 代理访问 kubectl proxy –address=’121.42.248.198′ –port=8087 –accept-hosts=’^*$’http://121.42.248.198:8087/api/v1/proxy/namespaces/kube-system/services/kibana-logging
在 Settings -> Indices 页面创建一个 index(相当于 mysql 中的一个 database),选中 Index contains time-based events,使用默认的 logstash-* pattern,点击 Create ;
如果你在这里发现 Create 按钮是灰色的无法点击,且 Time-filed name 中没有选项,fluentd 要读取 /var/log/containers/ 目录下的 log 日志,这些日志是从 /var/lib/docker/containers/${CONTAINER_ID}/${CONTAINER_ID}-json.log 链接过来的,查看你的 docker 配置,—log-driver 需要设置为 json-file 格式,默认的可能是 journald,参考 docker logging。
### 报警提醒 AlertManager、ElastAlert、Stackdriver
### API 网关服务 Kong + Cassandra
* Cassandra:分布式 NoSql 数据库
* Kong:需要在每台 Node 节点中运行服务。使用 DaemonSet 模式
### 事务追踪系统 Appdash、淘宝鹰眼、Zipkin
### 后台任务处理系统 Resque、Sidekiq、Delayed_job
### 事件驱动消息队列 Redis、Mq、Gearman
### CI/CD 持续集成 Jenkins
### 负载均衡 Traefik、Nginx、LVS、HAProxy
### PHP7 环境 部署
* 1. php 服务包括 nginx、php-fpm、memcache、scribe 等几大组件。
* 2. 将 PHP 服务相关的组件制作成一个镜像。服务通过容器命令来启动。nginx+php+memecache
* 3. 代码、配置、日志等经常变更部分通过挂载的方式和 docker 容器互动。代码镜像使用 busybox 为基础,大小仅 1M
* 镜像制作
1. 从镜像仓库里拉去 CentOS 作为基础镜像。
2. 运行镜像
3. 在运行容器中安装 PHP 环境相关软件包。
4. 提交修改并推送至仓库。
5. PHP 服务镜像制作完毕
* 代码镜像制作
Dockerfile
FROM registry.x.weibo.com/qinglong/busybox RUN mkdir -p /code/x.weibo.com ADD x.weibo.com /code/x.weibo.com
Build
registry.x.weibo.com/codeimg_x_weibo_com_git:324234
下载代码镜像、启动容器、拷贝代码
docker pull registry.x.weibo.com/codeimg_x_weibo_com_git:324234 docker run -name=code_container -t -i -d /phpcode codeimg_x_weibo_com_git: 324234 docker exec code_container cp -R /phpcode /code/x.weibo.com
* 配置文件镜像制作
* 配置文件制作成 docker 镜像
* 每台机器拉取镜像,替换配置文件
* 自定义脚本执行 reload 重启加载新配置文件生效
* 容器的优雅重启采用 docker exec xx reload 命令
### 复用包管理 Helm Chart
* 是一个用于 Kubernetes 的包管理工具,自动安装流行软件包,可重复构建,可配合持续化集成
* https://github.com/kubernetes/helm
* 分为客户端和服务端,客户端安装在笔记本上,服务端在集群中运行。
* 客户端安装:brew install kubernetes-helm
* 服务端安装:
#Kubernetes 必须 1.4.1 以上,本地必须有 kubectl 命令工具 #通过读取 $HOME/.kube/config 路径下的 Kubernetes 配置文件来决定安装服务端的环境,和 kubectl 命令工具使用的是同一个配置文件 #查看安装到哪个集群,查看当前运行环境 kubectl config current-context #本地初始化:helm init –kube-context= 安装到指定集群,默认为当前环境 #升级服务端:helm init –upgrade #helm 同样需要从谷歌拉取镜像,需要在本地仓库保存一份 #镜像使用问题,如果包配置中使用镜像拉取策略是使用远程的镜像,可以去 kubernetes 的 UI 界面中修改调度配置文件改成 imagePullPolicy:IfNotPresent 即可或者使用命令行修改更新,或直接修改使用的镜像文件为本地的
* 安装流程软件包:同一个包可以多次在同一集群环境中安装,并都能单独管理升级
* helm search 查看可安装的包列表
* helm repo update 更新资源列表;
* helm install stable/mysql –name 新名字 安装稳定版 kubectl describe services 查看服务
* helm inspect stable/mysql 了解查看包功能
* helm ls 查看已经发布的包
* helm list 查看已经部署的包
* helm delete 发布包名 删除发布的包
* helm status 发布包名 查看发布的包状态,配置信息,ip 等信息
* helm rollback happy-panda 1 回滚包
* helm upgrade 升级包
* helm get -h 帮助命令
* helm –debug 调试模式,输出命令的具体执行信息
* https://github.com/kubernetes/charts/tree/master/stable/ 常见包 github 地址
* 常见包 stable/datadog、stable/grafana、stable/influxdb、stable/jenkins、stable/memcached、stable/mongodb、stable/mysql、stable/redis、stable/postgresql、stable/openvpn、stable/rabbitmq、stable/cockroachdb 数据库、stable/traefik 负载均衡、stable/testlink 测试软件、stable/owncloud 私有云、stable/minio 分布式存储、stable/redmine 项目管理、stable/prometheus 服务监控系统、stable/gitlab-ce 版本管理、
* stable/wordpress 博客、stable/phpbb 论坛、stable/prestashop 电商、stable/opencart 电商、stable/joomla 框架、stable/drupal 框架、stable/osclass 分类信息系统、stable/orangehrm 人力资源、stable/odoo 企业 ERP、stable/mediawiki 百科、stable/dokuwiki 微型百科、
### 垃圾回收机制
* 集群中创建的不再使用的容器和镜像会定期被清理,每分钟清理一次容器,每 5 分钟清理一次镜像
* 只能清理被 kubelet 管理的容器。
* 镜像清理,只会根据磁盘的使用率来触发
## 调试
* kubectl describe 命令很有用
* 查询系统事件:kubectl describe pod 查看一个 Pod 的详细信息,其中 Event 事件信息对排错有用
* 查看容器日志:kubectl logs PodName -c 容器名
* 注意将集群的日志在启动参数中集中配置在指定目录中。
* 主要从 Kubelet 中查看 Pod 的完整日志、kube-controller-manager 日志、kube-scheduler 日志、kube-proxy 日志、防火墙
## 优化
## 常见问题
* 经常遇见谷歌域名在 Mac 环境下 DNS 解析 IP 地址出错,结果超时无法访问谷歌服务器下载镜像等文件
* 可以查看域名对应解析的 IP 如:host kubernetes-charts.storage.googleapis.com
* 使用 ping 命令 ping 域名出来的 IP 地址不一致的话可以清理 DNS 缓存:
* Mac 下:sudo killall -HUP mDNSResponder
* Liunx 下:systemctrl restart nscd 或 /etc/init.d/nscd restart
* 时区配置
ls -l /etc/localtime spec:
containers:
– name: my-testpod
image: 1604podimage:latest
volumeMounts:
– name: tz-config
mountPath: /etc/localtime
volumes:
– name: tz-config
hostPath:
path: /usr/share/zoneinfo/Asia/Shanghai
## 实际应用
* https://kubernetes.io/docs/samples/ 官方范例