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