首页 文章 精选 留言 我的

精选列表

搜索[k8s],共3937篇文章
优秀的个人博客,低调大师

K8s 应用管理之道 - 升级篇(一)

背景 随着小步快跑、快速迭代的开发模式被越来越多的互联网企业认同和采用,应用的变更、升级频率变得越来越频繁。为了应对不同的升级需求,保证升级过程平稳顺利地进行,诞生了一系列的部署发布模式。 停机发布 - 把老版的应用实例完全停止,再发布新的版本。这种发布模式主要为了解决新老版本互不兼容、无法共存的问题,缺点是一段时间内服务完全不可用。 蓝绿发布 - 在线上同时部署相同数量的新老版本应用实例。待新版本测试通过后,将流量一次性地切到新的服务实例上来。这种发布模式解决了停机发布中存在的服务完全不可用问题,但会造成比较大的资源消耗。 滚动发布 - 分批次逐步替换应用实例。这种发布模式不会中断服务,同时也不会消耗过多额外的资源,但由于新老版本实例同时在线,可能导致来自相同客户端的请求在新老版中切换而产生兼容性问题。 金丝雀发布 - 逐渐将流量从老版本

优秀的个人博客,低调大师

k8s与监控--prometheus的远端存储

前言 prometheus在容器云的领域实力毋庸置疑,越来越多的云原生组件直接提供prometheus的metrics接口,无需额外的exporter。所以采用prometheus作为整个集群的监控方案是合适的。但是metrics的存储这块,prometheus提供了本地 存储,即tsdb时序数据库。本地存储的优势就是运维简单,启动prometheus只需一个命令,下面两个启动参数指定了数据路径和保存时间。 storage.tsdb.path: tsdb数据库路径,默认 data/ storage.tsdb.retention: 数据保留时间,默认15天 缺点就是无法大量的metrics持久化。当然prometheus2.0以后压缩数据能力得到了很大的提升。 为了解决单节点存储的限制,prometheus没有自己实现集群存储,而是提供了远程读写的接口,让用户自己选择合适的时序数据库来实现prometheus的扩展性。 prometheus通过下面两张方式来实现与其他的远端存储系统对接 Prometheus 按照标准的格式将metrics写到远端存储 prometheus 按照标准格式从远端的url来读取metrics 下面我将重点剖析远端存储的方案 远端存储方案 配置文件 远程写 # The URL of the endpoint to send samples to. url: <string> # Timeout for requests to the remote write endpoint. [ remote_timeout: <duration> | default = 30s ] # List of remote write relabel configurations. write_relabel_configs: [ - <relabel_config> ... ] # Sets the `Authorization` header on every remote write request with the # configured username and password. # password and password_file are mutually exclusive. basic_auth: [ username: <string> ] [ password: <string> ] [ password_file: <string> ] # Sets the `Authorization` header on every remote write request with # the configured bearer token. It is mutually exclusive with `bearer_token_file`. [ bearer_token: <string> ] # Sets the `Authorization` header on every remote write request with the bearer token # read from the configured file. It is mutually exclusive with `bearer_token`. [ bearer_token_file: /path/to/bearer/token/file ] # Configures the remote write request's TLS settings. tls_config: [ <tls_config> ] # Optional proxy URL. [ proxy_url: <string> ] # Configures the queue used to write to remote storage. queue_config: # Number of samples to buffer per shard before we start dropping them. [ capacity: <int> | default = 100000 ] # Maximum number of shards, i.e. amount of concurrency. [ max_shards: <int> | default = 1000 ] # Maximum number of samples per send. [ max_samples_per_send: <int> | default = 100] # Maximum time a sample will wait in buffer. [ batch_send_deadline: <duration> | default = 5s ] # Maximum number of times to retry a batch on recoverable errors. [ max_retries: <int> | default = 10 ] # Initial retry delay. Gets doubled for every retry. [ min_backoff: <duration> | default = 30ms ] # Maximum retry delay. [ max_backoff: <duration> | default = 100ms ] 远程读 # The URL of the endpoint to query from. url: <string> # An optional list of equality matchers which have to be # present in a selector to query the remote read endpoint. required_matchers: [ <labelname>: <labelvalue> ... ] # Timeout for requests to the remote read endpoint. [ remote_timeout: <duration> | default = 1m ] # Whether reads should be made for queries for time ranges that # the local storage should have complete data for. [ read_recent: <boolean> | default = false ] # Sets the `Authorization` header on every remote read request with the # configured username and password. # password and password_file are mutually exclusive. basic_auth: [ username: <string> ] [ password: <string> ] [ password_file: <string> ] # Sets the `Authorization` header on every remote read request with # the configured bearer token. It is mutually exclusive with `bearer_token_file`. [ bearer_token: <string> ] # Sets the `Authorization` header on every remote read request with the bearer token # read from the configured file. It is mutually exclusive with `bearer_token`. [ bearer_token_file: /path/to/bearer/token/file ] # Configures the remote read request's TLS settings. tls_config: [ <tls_config> ] # Optional proxy URL. [ proxy_url: <string> ] PS 远程写配置中的write_relabel_configs 该配置项,充分利用了prometheus强大的relabel的功能。可以过滤需要写到远端存储的metrics。 例如:选择指定的metrics。 remote_write: - url: "http://prometheus-remote-storage-adapter-svc:9201/write" write_relabel_configs: - action: keep source_labels: [__name__] regex: container_network_receive_bytes_total|container_network_receive_packets_dropped_total global配置中external_labels,在prometheus的联邦和远程读写的可以考虑设置该配置项,从而区分各个集群。 global: scrape_interval: 20s # The labels to add to any time series or alerts when communicating with # external systems (federation, remote storage, Alertmanager). external_labels: cid: '9' 已有的远端存储的方案 现在社区已经实现了以下的远程存储方案 AppOptics: write Chronix: write Cortex: read and write CrateDB: read and write Elasticsearch: write Gnocchi: write Graphite: write InfluxDB: read and write OpenTSDB: write PostgreSQL/TimescaleDB: read and write SignalFx: write 上面有些存储是只支持写的。其实研读源码,能否支持远程读, 取决于该存储是否支持正则表达式的查询匹配。具体实现下一节,将会解读一下prometheus-postgresql-adapter和如何实现一个自己的adapter。 同时支持远程读写的 Cortex来源于weave公司,整个架构对prometheus做了上层的封装,用到了很多组件。稍微复杂。 InfluxDB 开源版不支持集群。对于metrics量比较大的,写入压力大,然后influxdb-relay方案并不是真正的高可用。当然饿了么开源了influxdb-proxy,有兴趣的可以尝试一下。 CrateDB 基于es。具体了解不多 TimescaleDB 个人比较中意该方案。传统运维对pgsql熟悉度高,运维靠谱。目前支持 streaming replication方案支持高可用。 后记 其实如果收集的metrics用于数据分析,可以考虑clickhouse数据库,集群方案和写入性能以及支持远程读写。这块正在研究中。待有了一定成果以后再专门写一篇文章解读。目前我们的持久化方案准备用TimescaleDB。 本文转自SegmentFault-k8s与监控--prometheus的远端存储

优秀的个人博客,低调大师

k8s RBAC 多租户权限控制实现

访问到权限分两部分 1.Authenticating认证授权配置由kube-apiserver管理 这里使用的是 Static Password File方式。apiserver启动yaml里配置basic-auth-file即可,容器 启动apiserver的话要注意这个文件需要是在容器内能访问到的。(可以通过挂载文件,或者在已经挂载的路径里增加配置文件)basic-auth-file文件格式见官方文档https://kubernetes.io/docs/admin/authentication/#static-password-file注意password在第一个,之前没注意被卡了很久。修改了文件以后需要重启apiserver才能生效。这里kubectldelete删除pod有问题,使用docker命令查看apiserver容器其实没有重启。解决方案是使用dockerkill杀掉容器。自动重启。 [root@tensorflow1 ~]# curl -u admin:admin "https://localhost:6443/api/v1/pods" -k { "kind": "Status", "apiVersion": "v1", "metadata": { }, "status": "Failure", "message": "pods is forbidden: User \"system:anonymous\" cannot list pods at the cluster scope", "reason": "Forbidden", "details": { "kind": "pods" }, "code": 403 } 这个就是没有通过认证的报错 2.Authorization授权 k8sRBAC授权规则https://kubernetes.io/docs/admin/authorization/rbac/ 简单来说就是 权限--角色--用户绑定需要配置两个文件一个是role/clusterRole,定义角色以及其权限一个是roleBinding/clusterRoleBinding,定义用户和角色的关系 { "kind": "Status", "apiVersion": "v1", "metadata": { }, "status": "Failure", "message": "pods is forbidden: User \"admin\" cannot list pods at the cluster scope", "reason": "Forbidden", "details": { "kind": "pods" }, "code": 403 } 这个就是没有权限访问,需要配置RBAC 文件如下:方案1:role + roleBinding kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: namespace: user1 name: pod-reader rules: - apiGroups: [""] # "" indicates the core API group resources: ["pods"] verbs: ["*"] - apiGroups: [""] # "" indicates the core API group resources: ["namespaces"] verbs: ["*"] kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: user1-rolebinding namespace: user1 subjects: - kind: User name: user1 # Name is case sensitive apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: myauth-user apiGroup: rbac.authorization.k8s.io 方案2:clusterRole + roleBinding (推荐) clusterRole定义全局权限,roleBinding将权限限制到namespace。clusterRole仅需要定义一次。 kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: myauth-user rules: - apiGroups: [""] # "" indicates the core API group resources: ["pods"] verbs: ["*"] - apiGroups: [""] # "" indicates the core API group resources: ["namespaces"] verbs: ["*"] - apiGroups: [""] # "" indicates the core API group resources: ["resourcequotas"] verbs: ["*"] kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: user2-rolebinding namespace: user2 subjects: - kind: User name: user2 # Name is case sensitive apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: myauth-user apiGroup: rbac.authorization.k8s.io kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: user1-rolebinding namespace: user1 subjects: - kind: User name: user1 # Name is case sensitive apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: myauth-user apiGroup: rbac.authorization.k8s.io 3.配置 新建静态密码文件 # vi /etc/kubernetes/pki/basic_auth_file admin,admin,1004 jane2,jane,1005 user1,user1,1006 user2,user2,1007 修改apiserver配置修改/etc/kubernetes/manifests/kube-apiserver.yaml在一堆参数配置下面增加 --basic-auth-file=/etc/kubernetes/pki/basic_auth_file eg: - --etcd-servers=https://127.0.0.1:2379 - --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt - --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt - --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key - --basic-auth-file=/etc/kubernetes/pki/basic_auth_file 这里将静态文件放在/etc/kubernetes/pki/目录下的原因是,apiserver通过容器启动,这个路径已经挂载容器中了,可以被访问到。放在其他路径需要额外配置挂载路径。apiserver只会启动在master节点上,故仅需要在master节点上配置即可。 启动好以后在master机器上执行kubectlgetall,多半是执行不成功的,因为修改apiserver配置文件后,apiserver自动重启,然后启动失败,所以就无法访问集群了。使用dockerps查看发现k8s_kube-scheduler和k8s_kube-controller-manager重启了,但是apiserver没起来。执行systemctlrestartkubelet,再dockerps就能看到apiserver启动成功了。如果还没启动起来,那再看看上面哪里配置有问题。 应用 使用--username={username}--password={password}参数访问kubectl 参考https://kubernetes-v1-4.github.io/docs/user-guide/kubectl/kubectl_create/ kubectl get all -n user1 --username=user1 --password=user1 kubectl create -f tf1-rc.yaml --username=user1 --password=user1 使用 curl -u {username}:{password} `js"https://{masterIP}:6443/api/v1/" -k访问httprestfulapicurl -u jane:jane2 "https://localhost:6443/api/v1/namespaces/user1/pods" -kcurl -u jane:jane2 "https://localhost:6443/api/v1/namespaces/user1" -k curl -u user1:user1 "https://localhost:6443/api/v1/namespaces/user1" -kcurl -u user1:user1 "https://localhost:6443/api/v1/namespaces/user1/pods" -kcurl -u user1:user1 "https://localhost:6443/api/v1/namespaces/user1/resourcequotas/" -k curl -u user2:user2 "https://localhost:6443/api/v1/namespaces/user2" -kcurl -u user2:user2 "https://localhost:6443/api/v1/namespaces/user2/pods" -kcurl -u user2:user2 "https://localhost:6443/api/v1/namespaces/user2/resourcequotas/" -k

优秀的个人博客,低调大师

k8s自动伸缩那些事 资料下载

弹性伸缩是Kubernetes中非常吸引开发者的重要特性。随着应用类型的不断细分,弹性伸缩也有了更多概念上的延伸。Kubernetes社区中在弹性伸缩方面布局了多个组件,从不同的场景、不同的角度、不同的思路来实现极致的弹性。在本课程中,会带领大家认识Kubernetes中弹性伸缩的组件功能、原理与使用。另外也会和大家一起探讨如何通过组件的组合实现充满弹性的Kubernetes集群。下面是本次直播的所有资料,全部奉上~ 直播视频全程链接:https://yq.aliyun.com/live/653 PPT精彩内容预览 PPT下载地址:https://yq.aliyun.com/download/3135 Kubernetes社区大群欢迎你 进群方式:1.点击链接即可入群:https://dwz.cn/G2EELckH2.扫描下方二维码进群

优秀的个人博客,低调大师

K8S存储卷常见问题 - NAS

注意:如果NAS挂载不上,可以手动在节点上执行mount 挂载,如果手动挂载也失败,则需要检查网络连通性等问题,可以联系NAS团队解决; 1. Pod挂载、卸载失败,日志中报Orphaned pod; 该问题为kubelet删除pod的bug,相关解决方法:链接 2. NAS挂载时间太长 如果NAS卷包含的文件量很大,且在挂载模板中配置了chmod参数,可能导致挂载时间过长的问题;可以去掉chmod参数; 3. NAS挂载失败,出现timeouot错误; 检查nas挂载点和集群是否在同一个vpc内,否则无法挂载;

优秀的个人博客,低调大师

K8S存储卷常见问题 - OSS

1. Pod挂载、卸载失败,日志中报Orphaned pod; 该问题为kubelet删除pod的bug,相关解决方法:链接 通过subpath挂载oss时候容器出现上述错误,目前不建议使用subpath方式。 2. 重启网络导致oss挂载不可用 升级集群、重启kubelet的时候,由于容器网络会重启,导致ossfs进程重启; ossfs重启会导致主机与容器目录映射失效,这时需要重启容器,或重建pod; 可以通过配置健康检查实现容器的重启,参考:OSS数据卷使用实践 2. oss挂载失败 检查使用的ak是否正确; 检查挂载使用的url是否网络可达

优秀的个人博客,低调大师

如何给K8S集群添加STS权限?

1. 登陆集群列表,找到要配置的集群: 2. 点击查看节点列表; 3. 点击某个master节点的实例ID,可以查看对应的RAM角色名: 同理,点击worker的实例ID,可以查看他的RAM角色, 4.到RAM控制台编辑RAM信息: 5.点击相应角色的管理按钮,选择“角色授权策略”– “查看权限“ 角色对应的权限必须有上述权限才能挂载云盘,如果没有上面的权限请点击“修改授权策略“来更新RAM; RAM修改的详细信息可以参考: https://help.aliyun.com/document_detail/28652.html?spm=a2c4g.11186623.6.564.UJIteo 另外:新添加的节点现在没有默认添加RAM角色,可以在ECS控制台,对应的节点下来框中编辑RAM,把集群所对应的worker RA

优秀的个人博客,低调大师

FAQ宝典之Rancher Server、K8s、Docker

Rancher FAQ宝典系列第二弹,Rancher Agent、Kubernetes、Docker相关的常见问题,本文一网打尽。 Rancher Agent常见问题 1、Rancher Agent无法启动的原因是什么? 1.1、添加 --NAME RANCHER-AGENT(老版本) 如果你从UI中编辑docker run .... rancher/agent...命令并添加--name rancher-agent选项,那么Rancher Agent将启动失败。Rancher Agent在初始运行时会启动3个不同容器,一个是运行状态的,另外两个是停止状态的。Rancher Agent要成功连接到Rancher Server必须要有两个名字分别为rancher-agent和rancher-agent-state的容器,第三个容器是docker自动分配的名称,这个容器会被移除。 1.2、使用一个克隆的虚拟机 如果你使用了克隆其他Agent主机的虚拟机并尝试注册它,它将不能工作。在rancher-agent容器的日志中会产生ERROR: Please re-register this agent.字样的日志。Rancher主机的唯一ID保存在/var/lib/rancher/state,因为新添加和虚拟机和被克隆的主机有相同的唯一ID,所以导致无法注册成功。 解决方法是在克隆的VM上运行以下命令: rm -rf /var/lib/rancher/state; docker rm -fv rancher-agent; docker rm -fv rancher-agent-state 完成后可重新注册。 2、我在哪里可以找到Rancher agent容器的详细日志? 从v1.6.0起,在rancher-agent容器上运行docker logs将提供agent相关的所有日志。 3、主机是如何自动探测IP的?我该怎么去修改主机IP?如果主机IP改变了(因为重启),我该怎么办? 当Agent连接Rancher Server时,它会自动检测Agent的IP。有时,自动探测的IP不是你想要使用的IP,或者选择了docker网桥的IP,如. 172.17.x.x。或者,你有一个已经注册的主机,当主机重启后获得了一个新的IP, 这个IP将会和Rancher UI中的主机IP不匹配。你可以重新配置“CATTLE_AGENT_IP”设置,并将主机IP设置为你想要的。当主机IP地址不正确时,容器将无法访问管理网络。要使主机和所有容器进入管理网络,只需编辑添加自定义主机的命令行,将新的IP指定为环境变量“CATTLE_AGENT_IP”。在主机上运行编辑后的命令。不要停止或删除主机上的现有的Rancher Agent容器! sudo docker run -d -e CATTLE_AGENT_IP=<NEW_HOST_IP> --privileged \ -v /var/run/docker.sock:/var/run/docker.sock \ rancher/agent:v0.8.2 http://SERVER_IP:8080/v1/scripts/xxxx 4、错误提示如下:INFO: Attempting to connect to:http://192.168.xx.xx:8080/v1ERROR:http://192.168.xx.xx:8080/v1is not accessible (Failed to connect to 192.168.xx.xx port 8080: No route to host) 这个问题主要有以下几种情况: RANCHER SERVER服务器防火墙没有开通8080端口; 云平台安全组没有放行8080端口; Agent 服务器没有开启IP转发规则 [为什么我的容器无法连接到网络?]:{site.baseurl}}/rancher/faqs/ troubleshooting/1为什么我的容器无法连接到网络; =1为开启,=0为关闭 /etc/sysctl.conf net.ipv4.ip_forward=1 net.ipv6.conf.all.forwarding=1 主机hosts(/etc/hosts)文件没有配置; 5、rancher下创建的服务容器,docker inspect 查看到Entrypoint和CMD后面有/.r/r字符,这个起什么作用? ./r 是基于weave wait编译出来的。CNI网络下会添加/.r/r 这个参数,目的是:当容器启动时,其实网络设备还没设置好,这时候需要container 等待,不能启动真实业务,否则会失败。 6、添加hosts后 server上没有列出,agent报Host not registered yet. Sleeping 1 second and trying again.” Attempt=0 reportedUuid=752031dd-8c7e-4666-5f93-020d7f4da5d3 检查主机名和hosts配置, hosts中需要配置: 127.0.0.1 localhost hostip hostname Kubernetes常见问题 1、部署Kubernetes时候出现以下有关cgroup的问题 Failed to get system container stats for "/system.slice/kubelet.service": failed to get cgroup stats for "/system.slice/kubelet.service": failed to get container info for "/system.slice/kubelet.service": unknown container "/system.slice/kubelet.service" Expected state running but got error: Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "process_linux.go:258: applying cgroup configuration for process caused \"mountpoint for devices not found\"" 以上问题为Kubernetes版本与docker版本不兼容导致cgroup功能失效 2、Kubernetes err: [nodes "iZ2ze3tphuqvc7o5nj38t8Z" not found]” Rancher-Kubernetes中,节点之间通信需要通过hostname,如果没有内部DNS服务器,那么需要为每台节点配置hosts文件。 配置示例:假如某个节点主机名为node1,ip 地址为192.168.1.100 cat /etc/hosts<<EOF 127.0.0.1 localhost 192.168.1.100 node1 EOF 3、如何验证你的主机注册地址设置是否正确? 如果你正面临Rancher Agent和Rancher Server的连接问题,请检查主机设置。当你第一次尝试在UI中添加主机时,你需要设置主机注册的URL,该URL用于建立从主机到Rancher Server的连接。这个URL必须可以从你的主机访问到。为了验证它,你需要登录到主机并执行curl命令: curl -i <Host Registration URL you set in UI>/v1 你应该得到一个json响应。如果开启了认证,响应代码应为401。如果认证未打开,则响应代码应为200。 注意:普通的HTTP请求和websocket连接(ws://)都将被使用。如果此URL指向代理或负载平衡器,请确保它们可以支持Websocket连接。 4、Kuberbetes UI显示Service unavailable 很多同学正常部署Kuberbetes环境后无法进入Dashboard,基础设施应用栈均无报错。但通过查看 基础架构|容器 发现并没有Dashboard相关的容器.因为Kuberbetes在拉起相关服务(如Dashboard、内置DNS等服务)是通过应用商店里面的YML文件来定义的,YML文件中定义了相关的镜像名和版本。 而Rancher部署的Kuberbetes应用栈属于Kuberbetes的基础框架,相关的镜像通过dockerhub/rancher 仓库拉取。默认Rancher-catalog Kuberbetes YML中服务镜像都是从谷歌仓库拉取,在没有科学上网的情况下,国内环境几乎无法成功拉取镜像。 为了解决这一问题,优化中国区用户的使用体验,在RANCHER v1.6.11之前的版本,我们修改了http://git.oschina.net/rancher/rancher-catalog 仓库中的YML文件,将相关的镜像也同步到国内仓库,通过替换默认商店地址来实现加速部署;在RANCHER v1.6.11及之后的版本,不用替换商店catalog地址,直接通过在模板中定义仓库地址和命名空间就行实现加速;在后期的版本种,Kuberbetes需要的镜像都会同步到docker hub中。 安装方法见:《原生加速中国区Kubernetes安装》,《Rancher-k8s加速安装文档》 Docker常见问题 1、镜像下载慢,如何提高下载速度? touch /etc/docker/daemon.json cat >> /etc/docker/daemon.json <<EOF { "insecure-registries": ["0.0.0.0/0"], "registry-mirrors": ["https://7bezldxe.mirror.aliyuncs.com"] } EOF systemctl daemon-reload && systemctl restart docker PS:0.0.0.0/0 表示信任所有非https地址的镜像仓库,对于内网测试,这样配置很方便。对于线上生产环境,为了安全请不要这样配置 2、如何配置Docker后端存储驱动? 以overlay为例 touch /etc/docker/daemon.json cat >> /etc/docker/daemon.json <<EOF { "storage-driver": "overlay" } EOF systemctl daemon-reload && systemctl restart docker 3、docker info 出现 WARNING WARNING: No swap limit support WARNING: No kernel memory limit support WARNING: No oom kill disable support 编辑/etc/default/grub文件,并设置:GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1" 接着 SUSE grub2-mkconfig -o /boot/grub2/grub.cfg Cetos Update grub Ubuntu update-grub 4、我怎么通过rancher让docker里的程序代理上网呢? 启动容器的时候,加一下 -e http_proxy= -e https_proxy= 5、Docker错误:无法删除文件系统 一些基于容器的实用程序(例如Google cAdvisor)会将Docker系统目录(如/ var / lib / docker /)挂载到容器中。例如,cadvisor的文档指示您运行cadvisor容器,如下所示: $ sudo docker run \ --volume=/:/rootfs:ro \ --volume=/var/run:/var/run:rw \ --volume=/sys:/sys:ro \ --volume=/var/lib/docker/:/var/lib/docker:ro \ --publish=8080:8080 \ --detach=true \ --name=cadvisor \ google/cadvisor:latest 当挂载/var/lib/docker/时,这会有效地将所有其他正在运行的容器的所有资源作为文件系统安装在挂载/var/lib/docker/的容器中。当您尝试删除这些容器中的任何一个时,删除尝试可能会失败,出现如下所示的错误: Error: Unable to remove filesystem for 74bef250361c7817bee19349c93139621b272bc8f654ae112dd4eb9652af9515: remove /var/lib/docker/containers/74bef250361c7817bee19349c93139621b272bc8f654ae112dd4eb9652af9515/shm: Device or resource busy 如果将/var/lib/docker/在/var/lib/docker/中的文件系统句柄上使用statfsor或fstatfs并且不关闭它们的容器,就会发生此问题。 通常,我们会以这种方式建议禁止挂载/var/lib/docker。然而,cAdvisor的核心功能需要这个绑定挂载。 如果您不确定是哪个进程导致错误中提到的路径繁忙并阻止它被删除,则可以使用lsof命令查找其进程。例如,对于上面的错误: sudo lsof /var/lib/docker/containers/74bef250361c7817bee19349c93139621b272bc8f65 本文转自 RancherLabs 51CTO博客,原文链接:http://blog.51cto.com/12462495/2050097

优秀的个人博客,低调大师

自己编译生成k8s的rpm包

我指的是以下几个安装包: -rw-r--r--. 1 root root 8976134 Jul 13 10:19 kubeadm-1.7.0-0.x86_64.rpm-rw-r--r--. 1 root root 9362110 Jul 13 10:19 kubectl-1.7.0-0.x86_64.rpm-rw-r--r--. 1 root root 17238982 Jul 13 10:19 kubelet-1.7.0-0.x86_64.rpm-rw-r--r--. 1 root root 7800450 Jul 13 10:19 kubernetes-cni-0.5.1-0.x86_64.rpm =============================== 参考说法: 官方的文档页面更新并不及时,同时他的 yum 源更新也很慢,再者…那他妈可是 Google 的服务器,能特么连上吗?以前总是在国外服务器使用yumdownloader下载,然后scp到本地,虽然能解决问题,但是蛋碎一地…最后找到了源头,如下 Kubernetes 编译的各种发行版安装包来源于 Github 上的另一个叫 release 的项目,地址点这里,把这个项目clone下来,由于本人是CentOS用户,所以进入 rpm 目录,在安装好 docker 的机器上执行那个docker-build.sh脚本即可编译 rpm 包,最后会生成到当前目录的output目录下,截图如下 https://github.com/kubernetes/release ==================================================== 这样,用kubeadm安装之前,rpm就可以先安装好啦。多,快,好,省! 有一个地方注意,默认会自动编译所有平台的,如果只要amd-x64,可以更改一下entry.sh文件,把其它平台去掉。加快时间。 当然,前提是要准备好fedora:24这个docker镜像文件哟。 #!/bin/sh # Entrypoint for the build container to create the rpms and yum repodata: # Usage: ./entry.sh GOARCH/RPMARCH,GOARCH/RPMARCH,.... set -e declare -a ARCHS if [ $# -gt 0 ]; then IFS=','; ARCHS=($1); unset IFS; else #GOARCH/RPMARCH ARCHS=( amd64/x86_64 arm/armhfp arm64/aarch64 ppc64le/ppc64le s390x/s390x ) fi for ARCH in ${ARCHS[@]}; do IFS=/ read GOARCH RPMARCH<<< ${ARCH}; unset IFS; SRC_PATH="/root/rpmbuild/SOURCES/${RPMARCH}" mkdir -p ${SRC_PATH} cp -r /root/rpmbuild/SPECS/* ${SRC_PATH} echo "Building RPM's for ${GOARCH}....." sed -i "s/\%global ARCH.*/\%global ARCH ${GOARCH}/" ${SRC_PATH}/kubelet.spec # Download sources if not already available cd ${SRC_PATH} && spectool -gf kubelet.spec /usr/bin/rpmbuild --target ${RPMARCH} --define "_sourcedir ${SRC_PATH}" -bb ${SRC_PATH}/kubelet.spec mkdir -p /root/rpmbuild/RPMS/${RPMARCH} createrepo -o /root/rpmbuild/RPMS/${RPMARCH}/ /root/rpmbuild/RPMS/${RPMARCH} done

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册