session保持 如何在service内部实现session保持呢?当然是在service的yaml里进行设置啦。 在service的yaml的sepc里加入以下代码: sessionAffinity: ClientIP sessionAffinityConfig: clientIP: timeoutSeconds: 10800 这样就开启了session保持。下面的timeoutSeconds指的是session保持的时间,这个时间默认是10800秒,也就是三个小时。 那么原理是啥呢?当不设置session保持时,service向后台pod转发规则是轮询。当设置了session保持之后,k8s会根据访问的ip来把请求转发给他以前访问过的pod,这样session就保持住了。 容器root权限 你一定很奇怪,明明进入容器内,可以看到是root用户啊,为什么还要设置容器的root权限?这是因为容器内虽然看起来是root,但是却没有root的所有功能。当需要修改系统文件时,就不被允许。如果你的app恰好就要去修改系统文件,那么就需要明白如何设置容器的root权限。 想要开启容器的root权限,需要做以下操作: 1.设置kube-apiserver与kubelet的 --allow-privileged=true 这样就允许节点上的容器开启privileged。 怎么看当前是不是为true呢? ps -ef|grep kube 然后仔细看,你就会看到是不是为true。 那么如何设置以上参数呢? 因为kube-apiserver与kubelet都是通过二进制文件直接运行的,所以直接在重启时加入以上参数就行。更简单的是,如果已经设置了systemd启动,那么就去/etc/systemd/system/下找到对应的.service文件,改里面的参数,然后通过systemctl命令直接重启就行。 2.设置包含contariners的yaml文件(如deploy的yaml文件),在containers下添加: securityContext: privileged: true 例如pod的yaml文件: apiVersion: v1 kind: Pod metadata: name: hello-world spec: containers: - name: hello-world-container # The container definition # ... securityContext: privileged: true 这个很好理解,但是切记要把这个与podSecurityContext分开。 podSecurityContext是在pod.spec内的属性,虽然它也写作securityContext securityContext是container内的属性 podSecurityContext的例子如下: apiVersion: v1 kind: Pod metadata: name: hello-world spec: containers: # specification of the pod’s containers # ... securityContext: fsGroup: 1234 supplementalGroups: [5678] seLinuxOptions: level: "s0:c123,c456" 多端口容器 如果app需要开放两个端口,该怎么办呢? 有两种办法, - 第一种是起2个service,每个service开放一个端口 - 第二种是同一个service开放2个端口 下面分析两种方法。 起两个service 明明可以用一个service搞定,为什么还要起两个service呢?我认为是让service更清晰,一个service负责一种服务。 例如,有个app,同时开发9200与9300端口。9200提供web服务,9300提供api。那么,用两个service,分别命名为app-http与app-api,分别暴露9200与9300端口,分别为nodePort与clusterIP方式,这样层次清晰。 同一个service开2个端口 一般我们只有一个端口的时候,在service的yaml文件: ports: - nodePort: 8482 port: 8080 protocol: TCP targetPort: 8080 而如果你想开两个端口,直接复制粘贴可不行,k8s会提示你必须要加上name。所以,如果要开多端口,要为每个port都指定一个name,如: ports: - name: http nodePort: 8482 port: 8080 protocol: TCP targetPort: 8080