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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM