• kubernetes session and 容器root权限


    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
  • 相关阅读:
    函数式编程一
    学习设计模式笔记
    看萧井陌直播写代码有感
    自定义事件
    template模板函数
    一个自己写的table插件,用到了一些ES6的语法
    requireJs简介
    underscore
    angular4.0
    New Machine Learning Server for Deep Learning in Nuke(翻译)
  • 原文地址:https://www.cnblogs.com/shanhua-fu/p/11864665.html
Copyright © 2020-2023  润新知