k8s常见问题解决

1.基础镜像制作规范和使用

1.1 时区修改
官网下载centos镜像默认时区是国外的时区,需要把它修改成上海时区。运维提供提一个基础的镜像给业务部门下载使用。

1.2 规范docker运行程序的用户
基于安全和规范的考虑,docker统一使用一个uid为1001的,用户名为pub的普通账号运行程序,需要在镜像和容器的宿主机上面同时新建。这个也是运维在初始化基础镜像和容器宿主机上面统一创建。

1.3 规范每个容器的cpu和内存(每个容器分配1核2G内存,视情况而定)

2.镜像下载策略

2.1 默认的镜像拉取策略是“IfNotPresent”,在镜像已经存在的情况下,kubelet将不在去拉取镜像。 如果总是想要拉取镜像,必须设置拉取策略为“Always”或者设置镜像标签为“:latest”。

如果没有指定镜像的标签,它会被假定为“:latest”,同时拉取策略为“Always”。

3.增加k8s各个命名空间的服务账号 default 的自定义权限(RABC)

首先,了解下什么是RABC:

基于角色的访问控制(Role-Based Access Control, 即”RBAC”)使用”rbac.authorization.k8s.io” API Group实现授权决策,允许管理员通过Kubernetes API动态配置策略。

在RBAC API中,一个角色包含了一套表示一组权限的规则。 权限以纯粹的累加形式累积(没有”否定”的规则)。 角色可以由命名空间(namespace)内的Role对象定义,而整个Kubernetes集群范围内有效的角色则通过ClusterRole对象实现

比如授予default命名空间的default ServiceAccount账号能够”get”, “watch”, “list”, “patch” default 命名空间里面的pod资源

3.1 定义role,一个Role对象只能用于授予对某一单一命名空间中资源的访问权限。 以下示例描述了”default”命名空间中的一个Role对象的定义,用于授予对pod的读访问权限:

1
2
3
4
5
6
7
8
9
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""] # 空字符串""表明使用core API group
resources: ["pods"]
verbs: ["get", "watch", "list", "patch"]

3.2 RoleBinding,角色绑定将一个角色中定义的各种权限授予一个或者一组用户。 角色绑定包含了一组相关主体(即subject, 包括用户——User、用户组——Group、或者服务账户——Service Account)以及对被授予角色的引用。 在命名空间中可以通过RoleBinding对象授予权限,而集群范围的权限授予则通过ClusterRoleBinding对象完成

1
2
3
4
5
6
7
8
9
10
11
12
13
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: read-pods
namespace: default
subjects:
- kind: ServiceAccount
name: default
apiGroup: ""
roleRef:
kind: Role
name: pod-reader
apiGroup: ""

4.docker使用http代理上传或者下载镜像

1.在里面系统shell里面设置的代理docker服务无法获取信息,需要在docker服务启动里面写代理信息。

默认情况下这个配置文件夹并不存在,我们要创建它。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ mkdir -p /etc/systemd/system/docker.service.d
#创建一个文件 /etc/systemd/system/docker.service.d/http-proxy.conf
#包含 HTTP_PROXY 环境变量:

[Service]
"HTTP_PROXY=http://username:pwd@192.168.34.216:3128/" "HTTPS_PROXY=http://username:pwd@192.168.34.216:3128/"

#有个注意的地方,如果直接写密码,docker无法识别,需要把密码进行url编码,注意,只需要把密码进行编码

#编码地址:http://tool.chinaz.com/tools/urlencode.aspx

#如果有局域网或者国内的registry,我们还需要使用 NO_PROXY 变量声明一下,比如测试环境的:

[Service]
Environment="HTTP_PROXY=http://pub:pwd@192.168.34.216:3128/" "HTTPS_PROXY=http://username:pwd@192.168.34.216:3128/" "NO_PROXY=localhost,127.0.0.1,registry.test.internal"

#刷新systemd配置:

$ sudo systemctl daemon-reload
#用系统命令验证环境变量加上去没:

$ systemctl show --property=Environment docker
Environment=HTTP_PROXY=http://username:pwd@192.168.34.216:3128/ HTTPS_PROXY=http://username:pwd@192.168.34.216:3128/ NO_PROXY=localhost,127.0.0.1,registry.test.internal
$ sudo systemctl restart docker

5.docker忽略https通信

有时我们内网搭建的容器私有仓库没有使用https,但是docker通信默认是使用https的,这是怎么办呢?经过查询,docker可以自定义对某个私有仓库不使用https,只需要在docker服务启动的脚本上面修改:
修改/usr/lib/systemd/system/docker.service(centos7配置路径)文件的启动命令ExecStart=/usr/bin/dockerd 改为 ExecStart=/usr/bin/dockerd –insecure-registry registry.test.internal*,如果有多个域名需要使用http通信,可使用–insecure-registry registry.xxx.xxx* 多个标记,然后reload配置和重启docker服务,命令如下:

1
2
3
4
#刷新systemd配置:
$ sudo systemctl daemon-reload
#重启docker服务:
$ sudo systemctl restart docker

6.master节点故障迁移

master节点的故障迁移简单就四点

第一步,把故障的节点从集群里面删掉

第二步,另外找一台安装好master组件,使用kubeadm join xxx –experimental-control-plane 即可

第三步,nginx-lb的nginx配置需要修改IP,然后重启nginx-lb 容器

第四步,把keepalive的配置迁移到新节点,启动keepalive即可(/etc/keepalived/keepalived.conf里面对应的IP需要修改)

7.k8s节点设置标签,不同业务根据选择不同的变迁进行发版

如:

kubectl label node node_xxx nodetype=baseserver

kubectl label node node2_xxx nodetype=bigdata

查看标签

kubectl get nodes –show-labels

部署deploy的时候配置文件选择对应标签的节点:

1
2
3
4
5
6
7
8
9
基础服务:

nodeSelector:
nodetype: baseserver

大数据:

nodeSelector:
nodetype: bigdata

deploy部分配置如下图:
deploy部分配置

# 推荐文章
  1.深刻理解Docker镜像大小
  2.k8s专题[1.k8s基础概念]
  3.k8s专题[10.使用Spinnaker持续发布应用]
  4.k8s专题[2.k8s设计原则]
  5.k8s专题[3.k8s基础组件]

评论


:D 一言句子获取中...