當前位置:首頁 » 文件傳輸 » 容器超時訪問
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

容器超時訪問

發布時間: 2022-10-28 11:48:28

❶ 如何解決docker宿主機無法訪問容器中的服務

1、每個鏡像都定義了可對外提供的介面,Nginx鏡像只默認提供了80和443埠,你自然無法訪問到容器內的8080埠。
2、只需要在docker create或者docker run創建容器時攜帶--expose參數,就能把指定的埠開放出來。
--expose Expose a port or a range of ports

❷ docker 容器無法訪問外網 宿主機是 centos7.2系統 裡面所有容器都無法訪問外網

在CentOS7中運行NodeJs的容器,發現掛載的本地目錄在容器中沒有執行許可權,經過各種驗證和Google搜索,找到了問題的原因,這里做一下記錄。原因是CentOS7中的安全模塊selinux把許可權禁掉了,至少有以下三種方式解決掛載的目錄沒有許可權的問題:
1,在運行容器的時候,給容器加特權:
示例:docker run -i -t --privileged=true -v /home/docs:/src waterchestnut/nodejs:0.12.0
2,臨時關閉selinux:
示例:su -c "setenforce 0"
之後執行:docker run -i -t -v /home/docs:/src waterchestnut/nodejs:0.12.0
注意:之後要記得重新開啟selinux,命令:su -c "setenforce 1"
3,添加selinux規則,將要掛載的目錄添加到白名單:
示例:chcon -Rt svirt_sandbox_file_t /home/docs
之後執行:docker run -i -t -v /home/docs:/src waterchestnut/nodejs:0.12.0

❸ 如何解決docker宿主機無法訪問容器中的服務

docker搭建了lnmp環境後,如果需要訪問安裝在宿主機上的資料庫或中間件,是不能直接使用127.0.0.1這個ip的,這個ip在容器中指向容器自己,那麼應該怎麼去訪問宿主機呢:
例如你的docker環境的虛擬IP是192.168.99.100,那麼宿主機同樣會託管一個和192.168.99.100同網段的虛擬IP,並且會是主IP:192.168.99.1,那麼就簡單了,在容器中訪問192.168.99.1這個地址就等於訪問宿主機,問題解決
注意,通過192.168.99.1訪問宿主機,等於換了一個ip,如果資料庫或中間件限制了本機訪問或者做了ip段限制,要記得添加192.168.99.1到白名單

❹ 請問Web容器如何判斷Session是超時的呢(稍難)

實現監聽器,當seession銷毀時,會觸發seesion銷毀事件,判斷一下是不是用戶的session被銷毀,如果是,說明session超時,或發生其它異常!

❺ Pod的特性

Pod是k8s系統中可以創建和管理的最小單元,是資源對象模型中由用戶創建或部署的最小資源對象模型,也是在k8s上運行容器化應用的資源對象,其他的資源對象都是用來支撐或者擴展Pod對象功能的,比如控制器對象是用來管控Pod對象的,Service或者Ingress資源對象是用來暴露Pod引用對象的,PersistentVolume資源對象是用來為Pod提供存儲等等,k8s不會直接處理容器,而是Pod,Pod是由一個或者多個container組成的。

每個Pod都是運行應用的單個實例,如果需要水平擴展應用(例如,運行多個實例),則應該使用多個Pods,每個實例一個Pod。在Kubernetes中,這樣通常稱為Replication。Replication的Pod通常由Controller創建和管理。

Pod可以被理解成一群可以共享網路、存儲和計算資源的容器化服務的集合。再打個形象的比喻,在同一個Pod里的幾個Docker服務/程序,好像被部署在同一台機器上,可以通過localhost互相訪問,並且可以共用Pod里的存儲資源(這里是指Docker可以掛載Pod內的數據卷,數據卷的概念,後文會詳細講述,暫時理解為「需要手動mount的磁碟」)。筆者總結Pod如下圖,可以看到:同一個Pod之間的Container可以通過localhost互相訪問,並且可以掛載Pod內所有的數據卷;但是不同的Pod之間的Container不能用localhost訪問,也不能掛載其他Pod的數據卷。

1.1、為什麼需要pod
我們先談談為什麼k8s會使用pod這個最小單元,而不是使用docker的容器,k8s既然使用了pod,當然有它的理由。

1、更利於擴展
k8s不僅僅支持Docker容器,也支持rkt甚至用戶自定義容器,為什麼會有這么多不同的容器呢,因為容器並不是真正的虛擬機,docker的一些概念和誤區總結,此外,Kubernetes不依賴於底層某一種具體的規則去實現容器技術,而是通過CRI這個抽象層操作容器,這樣就會需要pod這樣一個東西,pod內部再管理多個業務上緊密相關的用戶業務容器,就會更有利用業務擴展pod而不是擴展容器。

2、更容易定義一組容器的狀態

如果我們沒有使用pod,而是直接使用一組容器去跑一個業務呢,那麼當其中一個或者若干個容器出現問題呢,我們如何去定義這一組容器的狀態呢,通過pod這個概念,這個問題就可以很好的解決,一組業務容器跑在一個k8s的pod中,這個pod中會有一個pause容器,這個容器與其他的業務容器都沒有關系,以這個pause容器的狀態來代表這個pod的狀態.

3、利於容器間文件共享,以及通信。
pod里的多個業務容器共享pause容器的ip和存儲卷Volume,pod中的其他容器共享pause容器的ip地址和存儲,這樣就做到了文件共享和互信。

1.2 Pod 特性:
1 資源共享:IP和Volume
一個Pod里的多個容器可以共享存儲和網路IP,可以看作一個邏輯的主機。共享的如 namespace,cgroups或者其他的隔離資源。

多個容器共享同一個network namespace,由此在一個Pod里的多個容器共享Pod的IP和埠namespace,所以一個Pod內的多個容器之間可以通過localhost來進行通信,所需要注意的是不同容器要注意不要有埠沖突即可。不同的Pod有不同的IP,不同Pod內的多個容器之前通信,不可以使用IPC(如果沒有特殊指定的話)通信,通常情況下使用Pod的IP進行通信。

k8s要求底層網路支持集群內任意兩個pod直接的TCP/IP直接通信,這通常才有虛擬二層網路技術來實現,例如Flannel,Openswitch等。

一個Pod里的多個容器可以共享存儲卷,這個存儲卷會被定義為Pod的一部分,並且可以掛載到該Pod里的所有容器的文件系統上。

2 生命周期短暫
Pod屬於生命周期比較短暫的組件,比如,當Pod所在節點發生故障,那麼該節點上的Pod會被調度到其他節點,但需要注意的是,被重新調度的Pod是一個全新的Pod,跟之前的Pod沒有半毛錢關系。

3 平坦的網路
K8s集群中的所有Pod都在同一個共享網路地址空間中,也就是說每個Pod都可以通過其他Pod的IP地址來實現訪問。

1.3 Pod使用和管理
1、核心原則是:將多個應用分散到多個Pod中 原因:基於資源的合理應用;擴縮容,不同應用應該有不同的擴縮容策略等。

結論:單Pod單容器應用,除非特殊原因。
你很少會直接在kubernetes中創建單個Pod。因為Pod的生命周期是短暫的,用後即焚的實體。當Pod被創建後(不論是由你直接創建還是被其他Controller),都會被Kubernetes調度到集群的Node上。直到Pod的進程終止、被刪掉、因為缺少資源而被驅逐、或者Node故障之前這個Pod都會一直保持在那個Node上。

Pod不會自愈。如果Pod運行的Node故障,或者是調度器本身故障,這個Pod就會被刪除。同樣的,如果Pod所在Node缺少資源或者Pod處於維護狀態,Pod也會被驅逐。Kubernetes使用更高級的稱為Controller的抽象層,來管理Pod實例。雖然可以直接使用Pod,但是在Kubernetes中通常是使用Controller來管理Pod的。

1.4、Pod和Controller
Controller可以創建和管理多個Pod,提供副本管理、滾動升級和集群級別的自愈能力。例如,如果一個Node故障,Controller就能自動將該節點上的Pod調度到其他健康的Node上。

包含一個或者多個Pod的Controller示例:

Deployment
StatefulSet
DaemonSet
通常,Controller會用你提供的Pod Template來創建相應的Pod。

在用戶定義范圍內,如果pod增多,則ReplicationController會終止額外的pod,如果減少,RC會創建新的pod,始終保持在定義范圍。例如,RC會在Pod維護(例如內核升級)後在節點上重新創建新Pod。

對Pod的定義可以通過Yaml或Json格式的配置文件來完成。關於Yaml或Json中都能寫哪些參數,參考官網 http://kubernetes.io/docs/user-guide/pods/multi-container/

Pod的yaml整體文件內容及功能註解如下:

我們來看一個段實際的例子

在使用docker時,我們可以使用docker run命令創建並啟動一個容器,而在Kubernetes系統中對長時間運行的容器要求是:其主程序需要一直在前台運行。如果我們創建的docker鏡像的啟動命令是後台執行程序,例如Linux腳本

nohup ./startup.sh &

則kubelet創建包含這個容器的pod後運行完該命令,即認為Pod執行結束,之後根據RC中定義的pod的replicas副本數量生產一個新的pod,而一旦創建出新的pod,將在執行完命令後陷入無限循環的過程中,這就是Kubernetes需要我們創建的docker鏡像以一個前台命令作為啟動命令的原因。

對於無法改造為前台執行的應用,也可以使用開源工具supervisor輔助進行前台運行的功能。

Pod可以由一個或多個容器組合而成

場景1:單個應用多個容器
spring boot web:

kubectl create -f springboot-deployment.yml

kubectl get pods -o wide

加入 –o wide參數 查看額外信息:包括node和ip

pod處於pending的原因:通過 kubectl describe pods springbootweb 進一步查找問題。

可以看到pod的鏡像信息寫錯了:

先刪除pod,然後再創建: kubectl delete pod springbootweb

由於創建的埠號是9081,可以直接訪問:curl 10.0.86.2:9081

# curl 10.0.86.2:9081
Hello world

場景2:Pod不同應用多個容器組合而成
例如:兩個容器應用的前端frontend和redis為緊耦合的關系,應該組合成一個整體對外提供服務,則應該將這兩個打包為一個pod.

配置文件frontend-localredis-pod.yaml如下:

屬於一個Pod的多個容器應用之間相互訪問只需要通過localhost就可以通信,這一組容器被綁定在一個環境中。

使用kubectl create創建該Pod後,get Pod信息可以看到如下圖:

#kubectl get gods

可以看到READY信息為2/2,表示Pod中的兩個容器都成功運行了.
2.3 集群外部訪問Pod
上面的例子,在k8s集群的安裝有kube-proxy的node節點上,可以直接通過curl 10.0.86.2:9081 訪問集群的pod。但在集群外的客戶端系統無法通過Pod的IP地址或者Service的虛擬IP地址和虛擬埠號訪問到它們。為了讓外部客戶端可以訪問這些服務,可以將Pod或Service的埠號映射到宿主機,以使得客戶端應用能夠通過物理機訪問容器應用。

1、將容器應用的埠號映射到物理機

(2)通過設置Pod級別的hostNetwork-true,該Pod中所有容器的埠號都將被直接映射到物理機上。設置hostNetwork-true時需要注意,在容器的ports定義部分如果不指定hostPort,則默認hostPort等於containerPort,如果指定了hostPort,則hostPort必須等於containerPort的值。

靜態pod是由kubelet進行管理的僅存在於特定Node的Pod上,他們不能通過API Server進行管理,無法與ReplicationController、Deployment或者DaemonSet進行關聯,並且kubelet無法對他們進行健康檢查。靜態Pod總是由kubelet進行創建,並且總是在kubelet所在的Node上運行。

創建靜態Pod有兩種方式:配置文件或者HTTP方式

1)配置文件方式
首先,需要設置kubelet的啟動參數"--config",指定kubelet需要監控的配置文件所在的目錄,kubelet會定期掃描該目錄,並根據目錄中的 .yaml或 .json文件進行創建操作

假設配置目錄為/etc/kubelet.d/配置啟動參數:--config=/etc/kubelet.d/,然後重啟kubelet服務後,再宿主機受用docker ps或者在Kubernetes Master上都可以看到指定的容器在列表中

由於靜態pod無法通過API Server直接管理,所以在master節點嘗試刪除該pod,會將其變為pending狀態,也不會被刪除

#kubetctl delete pod static-web-node1

要刪除該pod的操作只能在其所在的Node上操作,將其定義的.yaml文件從/etc/kubelet.d/目錄下刪除

#rm -f /etc/kubelet.d/static-web.yaml

#docker ps

Volume類型包括:emtyDir、hostPath、gcePersistentDisk、awsElasticBlockStore、gitRepo、secret、nfs、scsi、glusterfs、persistentVolumeClaim、rbd、flexVolume、cinder、cephfs、flocker、downwardAPI、fc、azureFile、configMap、vsphereVolume等等,可以定義多個Volume,每個Volume的name保持唯一。在同一個pod中的多個容器能夠共享pod級別的存儲卷Volume。Volume可以定義為各種類型,多個容器各自進行掛載操作,講一個Volume掛載為容器內需要的目錄。

如下圖:

如上圖中的Pod中包含兩個容器:tomcat和busybox,在pod級別設置Volume 「app-logs」,用於tomcat想其中寫日誌文件,busybox讀日誌文件。

配置文件如下:

busybox容器可以通過kubectl logs查看輸出內容

#kubectl logs volume-pod -c busybox

tomcat容器生成的日誌文件可以登錄容器查看
#kubectl exec -ti volume-pod -c tomcat -- ls /usr/local/tomcat/logs

應用部署的一個最佳實踐是將應用所需的配置信息於程序進行分離,這樣可以使得應用程序被更好的復用,通過不用配置文件也能實現更靈活的功能。將應用打包為容器鏡像後,可以通過環境變數或外掛文件的方式在創建容器時進行配置注入。ConfigMap是Kubernetes v1.2版本開始提供的一種統一集群配置管理方案。

6.1 ConfigMap:容器應用的配置管理
容器使用ConfigMap的典型用法如下:

ConfigMap以一個或多個key:value的形式保存在Kubernetes系統中共應用使用,既可以用於表示一個變數的值,也可以表示一個完整的配置文件內容。

通過yuaml配置文件或者直接使用kubelet create configmap 命令的方式來創建ConfigMap

6.2 ConfigMap的創建
舉個小例子cm-appvars.yaml來描述將幾個應用所需的變數定義為ConfigMap的用法:

# vim cm-appvars.yaml

執行kubectl create命令創建該ConfigMap

#kubectl create -f cm-appvars.yaml

查看建立好的ConfigMap:

#kubectl get configmap
kubectl describe configmap cm-appvars
kubectl get configmap cm-appvars -o yaml

另:創建一個cm-appconfigfile.yaml描述將兩個配置文件server.xml和logging.properties定義為configmap的用法,設置key為配置文件的別名,value則是配置文件的文本內容:

在pod "cm-test-app"定義中,將configmap "cm-appconfigfile"中的內容以文件形式mount到容器內部configfiles目錄中。

Pod配置文件cm-test-app.yaml內容如下:

創建該Pod:
#kubectl create -f cm-test-app.yaml
Pod "cm-test-app"created

登錄容器查看configfiles目錄下的server.xml和logging.properties文件,他們的內容就是configmap 「cm-appconfigfile」中定義的兩個key的內容
#kubectl exec -ti cm-test-app -- bash
root@cm-rest-app:/# cat /configfiles/server.xml
root@cm-rest-app:/# cat /configfiles/ logging.properties

6.3使用ConfigMap的條件限制
使用configmap的限制條件如下:

Pod在整個生命周期過程中被定義為各種狀態,熟悉Pod的各種狀態有助於理解如何設置Pod的調度策略、重啟策略

Pod的狀態包含以下幾種,如圖:

Pod的重啟策略(RestartPolicy)應用於Pod內所有的容器,並且僅在Pod所處的Node上由kubelet進行判斷和重啟操作。當某哥容器異常退出或者健康檢查石柏師,kubelet將根據RestartPolicy的設置進行相應的操作

Pod的重啟策略包括Always、OnFailure及Nerver,默認值為Always。

kubelet重啟失效容器的時間間隔以sync-frequency乘以2n來計算,例如1、2、4、8倍等,最長延時5分鍾,並且成功重啟後的10分鍾後重置該事件。

Pod的重啟策略和控制方式息息相關,當前可用於管理Pod的控制器寶庫ReplicationController、Job、DaemonSet及直接通過kubelet管理(靜態Pod),每種控制器對Pod的重啟策略要求如下:

RC和DaemonSet:必須設置為Always,需要保證該容器持續運行
Job:OnFailure或Nerver,確保容器執行完成後不再重啟
kubelet:在Pod失效時重啟他,不論RestartPolicy設置什麼值,並且也不會對Pod進行健康檢查

對Pod的健康檢查可以通過兩類探針來檢查:LivenessProbe和ReadinessProbe

LivenessProbe探針:用於判斷容器是否存活(running狀態),如果LivenessProbe探針探測到容器不健康,則kubelet殺掉該容器,並根據容器的重啟策略做響應處理
ReadinessProbe探針:用於判斷容器是否啟動完成(ready狀態),可以接受請求。如果ReadinessProbe探針探測失敗,則Pod的狀態被修改。Endpoint Controller將從service的Endpoint中刪除包含該容器所在的Pod的Endpoint。
kubelet定製執行LivenessProbe探針來診斷容器的健康狀況。LivenessProbe有三種事項方式。

1)ExecAction:在容器內部執行一個命令,如果該命令的返回值為0,則表示容器健康。例:

(2)TCPSocketAction:通過容器ip地址和埠號執行TCP檢查,如果能夠建立tcp連接表明容器健康。例:

3)HTTPGetAction:通過容器Ip地址、埠號及路徑調用http get方法,如果響應的狀態嗎大於200且小於400,則認為容器健康。例:

對於每種探針方式,都需要設置initialDelaySeconds和timeoutSeconds兩個參數,它們含義如下:

initialDelaySeconds:啟動容器後首次監控檢查的等待時間,單位秒
timeouSeconds:健康檢查發送請求後等待響應的超時時間,單位秒。當發生超時就被認為容器無法提供服務無,該容器將被重啟
九.玩轉Pod調度
在Kubernetes系統中,Pod在大部分場景下都只是容器的載體而已,通常需要通過RC、Deployment、DaemonSet、Job等對象來完成Pod的調度和自動控制功能。

9.1 RC、Deployment:全自動調度
RC的主要功能之一就是自動部署容器應用的多份副本,以及持續監控副本的數量,在集群內始終維護用戶指定的副本數量。

在調度策略上,除了使用系統內置的調度演算法選擇合適的Node進行調度,也可以在Pod的定義中使用NodeName、NodeSelector或NodeAffinity來指定滿足條件的Node進行調度。

1)NodeName
Pod.spec.nodeName用於強制約束將Pod調度到指定的Node節點上,這里說是「調度」,但其實指定了nodeName的Pod會直接跳過Scheler的調度邏輯,直接寫入PodList列表,該匹配規則是強制匹配。

2)NodeSelector:定向調度
Kubernetes Master上的scheler服務(kube-Scheler進程)負責實現Pod的調度,整個過程通過一系列復雜的演算法,最終為每個Pod計算出一個最佳的目標節點,通常我們無法知道Pod最終會被調度到哪個節點上。實際情況中,我們需要將Pod調度到我們指定的節點上,可以通過Node的標簽和pod的nodeSelector屬性相匹配來達到目的。

Pod.spec.nodeSelector是通過kubernetes的label-selector機制進行節點選擇,由scheler調度策略MatchNodeSelector進行label匹配,調度pod到目標節點,該匹配規則是強制約束。

啟用節點選擇器的步驟為:

kubectl label nodes <node-name> <label-key>=<label-value>

例: #kubectllabel nodes k8s-node-1 zonenorth

運行kubectl create -f命令創建Pod,scheler就會將該Pod調度到擁有zone=north標簽的Node上。 如果多個Node擁有該標簽,則會根據調度演算法在該組Node上選一個可用的進行Pod調度。

需要注意的是:如果集群中沒有擁有該標簽的Node,則這個Pod也無法被成功調度。

3)NodeAffinity:親和性調度
該調度策略是將來替換NodeSelector的新一代調度策略。由於NodeSelector通過Node的Label進行精確匹配,所有NodeAffinity增加了In、NotIn、Exists、DoesNotexist、Gt、Lt等操作符來選擇Node。調度側露更加靈活。

9.2 DaemonSet:特定場景調度
DaemonSet用於管理集群中每個Node上僅運行一份Pod的副本實例,如圖:

這種用法適合一些有下列需求的應用:

在實際生產環境中,我們經常遇到某個服務需要擴容的場景,也有可能因為資源精確需要縮減資源而需要減少服務實例數量,此時我們可以Kubernetes中RC提供scale機制來完成這些工作。

以redis-slave RC為例,已定義的最初副本數量為2,通過kubectl scale命令可以將Pod副本數量

#kubectl scale rc redis-slave --replicas=3
ReplicationController"redis-slave" scaled
#kubectl get pods

除了可以手工通過kubectl scale命令完成Pod的擴容和縮容操作以外,新版本新增加了Horizontal Podautoscaler(HPA)的控制器,用於實現基於CPU使用路進行啟動Pod擴容縮容的功能。該控制器基於Mastger的kube-controller-manager服務啟動參數 --horizontal-pod-autoscler-sync-period定義的時長(默認30秒),周期性監控目標Pod的Cpu使用率並在滿足條件時對ReplicationController或Deployment中的Pod副本數量進行調整,以符合用戶定義的平均Pod Cpu使用率,Pod Cpu使用率來源於heapster組件,所以需預先安裝好heapster。

當集群中的某個服務需要升級時,我們需要停止目前與該服務相關的所有Pod,然後重新拉取鏡像並啟動。如果集群規模較大,因服務全部停止後升級的方式將導致長時間的服務不可用。由此,Kubernetes提供了rolling-update(滾動升級)功能來解決該問題。

滾動升級通過執行kubectl rolling-update命令一鍵完成,該命令創建一個新的RC,然後自動控制舊版本的Pod數量逐漸減少到0,同時新的RC中的Pod副本數量從0逐步增加到目標值,最終實現Pod的升級。需要注意的是,系統要求新的RC需要與舊的RC在相同的Namespace內,即不能把別人的資產轉到到自家名下。
例:將redis-master從1.0版本升級到2.0:

需要注意的點:

運行kubectl rolling-update來完成Pod的滾動升級:

#kubectl rolling-update redis-master -f redis-master-controller-v2.yaml

另一種方法就是不使用配置文件,直接用kubectl rolling-update加上--image參數指定新版鏡像名來完成Pod的滾動升級

#kubectl rolling-update redis-master --image=redis-master:2.0

與使用配置文件的方式不同的是,執行的結果是舊的RC被刪除,新的RC仍然使用就的RC的名字。

如果在更新過程總發現配置有誤,則用戶可以中斷更新操作,並通過執行kubectl rolling-update-rollback完成Pod版本的回滾。

❻ 微服務容器化網關訪問不了

兩者未指定埠。
UAA伺服器將具有埠和主機名。兩者都需要指定。要指定埠,您需要更改application.properties。

❼ docker容器顯示graylog啟動成功但無法訪問

對,就是說明你之前的這個容器它出現了這個微觀法啟動的狀況,就是說明他這個訪問過程可能是失效了。

❽ 如何解決docker宿主機無法訪問容器中的服務

有時候,查看資源管理器你會發現一個奇怪的現象。物理內存使用率沒超過50%,就開始使用swap空間了。用swap顯然沒有使用物理內存快。如何修改?
在ubuntu 裡面,swappiness的值的大小對如何使用swap分區是有著很大的聯系的。
swappiness=0的時候表示最大限度使用物理內存,然後才是 swap空間;swappiness=100的時候表示積極的使用swap分區,並且把內存上的數據及時的搬運到swap空間裡面。兩個極端,對於 ubuntu的默認設置,這個值等於60,建議修改為10。具體這樣做:
1、查看你的系統裡面的swappiness,在終端輸入 cat /proc/sys/vm/swappiness,不出意外結果應該是60
2、修改swappiness值為10。在終端輸入 sudo gedit /etc/sysctl.conf ,然後在最後一行添加 vm.swappiness=10 ,保存。
3、重啟電腦,使設置生效。
這樣Ubuntu就能最大限度使用物理內存了!!