金慶的專欄
C++博客
::
首頁
::
新隨筆
::
聯系
::
聚合
::
管理
::
423 隨筆 :: 0 文章 :: 454 評論 :: 0 Trackbacks
公告
我的隨筆
我的評論
我參與的隨筆
留言簿
(12)
給我留言
查看公開留言
查看私人留言
隨筆分類
(502)
1. C/C++(166)
(rss)
2. 網游開發(108)
(rss)
3. Golang(20)
(rss)
4. Linux/Unix(30)
(rss)
5. 軟工與管理(44)
(rss)
6. Python(23)
(rss)
7. Erlang(18)
(rss)
8. Rust(16)
(rss)
9. 其它(77)
(rss)
隨筆檔案
(423)
2023年1月 (1)
2022年11月 (1)
2022年10月 (2)
2022年9月 (1)
2022年4月 (6)
2022年1月 (2)
2021年12月 (4)
2021年11月 (6)
2021年10月 (2)
2021年9月 (2)
2021年8月 (7)
2021年7月 (2)
2021年5月 (2)
2021年3月 (1)
2021年2月 (2)
2021年1月 (1)
2020年12月 (1)
2020年10月 (1)
2020年9月 (5)
2020年8月 (1)
2020年7月 (1)
2020年6月 (1)
2020年4月 (2)
2020年3月 (3)
2020年2月 (3)
2020年1月 (1)
2019年12月 (1)
2019年9月 (2)
2019年4月 (2)
2019年1月 (1)
2018年12月 (1)
2018年11月 (3)
2018年10月 (1)
2018年9月 (3)
2018年8月 (3)
2018年7月 (2)
2018年6月 (4)
2018年5月 (4)
2018年4月 (4)
2018年3月 (1)
2018年1月 (2)
2017年12月 (2)
2017年11月 (3)
2017年10月 (3)
2017年8月 (7)
2017年7月 (1)
2017年6月 (1)
2017年5月 (3)
2017年4月 (3)
2017年3月 (3)
2017年2月 (2)
2017年1月 (2)
2016年12月 (5)
2016年11月 (2)
2016年10月 (2)
2016年9月 (1)
2016年8月 (6)
2016年7月 (3)
2016年6月 (2)
2016年5月 (4)
2016年4月 (2)
2016年3月 (2)
2016年1月 (3)
2015年12月 (2)
2015年11月 (2)
2015年10月 (1)
2015年8月 (2)
2015年7月 (1)
2015年6月 (1)
2015年5月 (4)
2015年4月 (3)
2015年3月 (4)
2015年2月 (5)
2015年1月 (4)
2014年12月 (3)
2014年11月 (3)
2014年10月 (2)
2014年9月 (3)
2014年8月 (1)
2014年4月 (4)
2014年3月 (1)
2014年2月 (4)
2014年1月 (5)
2013年12月 (5)
2013年11月 (5)
2013年9月 (2)
2013年8月 (2)
2013年7月 (2)
2013年6月 (2)
2013年5月 (1)
2013年1月 (2)
2012年12月 (1)
2012年11月 (1)
2012年9月 (1)
2012年8月 (3)
2012年7月 (2)
2012年6月 (1)
2012年4月 (3)
2012年3月 (2)
2012年2月 (3)
2012年1月 (2)
2011年11月 (2)
2011年10月 (3)
2011年9月 (2)
2011年8月 (2)
2011年7月 (3)
2011年6月 (2)
2011年5月 (3)
2011年1月 (2)
2010年12月 (1)
2010年11月 (2)
2010年10月 (2)
2010年9月 (3)
2010年8月 (2)
2010年7月 (3)
2010年6月 (1)
2010年5月 (3)
2010年4月 (3)
2010年3月 (5)
2010年2月 (4)
2010年1月 (4)
2009年12月 (2)
2009年11月 (3)
2009年10月 (4)
2009年9月 (3)
2009年8月 (2)
2009年7月 (4)
2009年6月 (1)
2009年5月 (3)
2009年4月 (4)
2009年3月 (2)
2009年2月 (5)
2009年1月 (1)
2008年12月 (7)
2008年11月 (4)
2008年10月 (1)
2008年9月 (3)
2008年8月 (4)
2008年7月 (3)
2008年6月 (4)
2008年5月 (6)
2008年4月 (7)
2008年3月 (6)
2008年1月 (5)
2007年12月 (7)
2007年11月 (4)
2007年10月 (5)
2007年9月 (6)
2007年8月 (8)
2007年7月 (5)
相冊
公告照片
搜索
積分與排名
積分 - 653959
排名 - 25
最新評論
1.?re: boost::asio::spawn 將一統C++網絡庫
asio 成為C++首選網絡庫
--linda
2.?re: log4cxx中文輸出錯誤補丁
評論內容較長,點擊標題查看
--金慶
3.?re: mingw編譯OrzNet
能發送一個mingw編譯好的OrzNet庫給我嗎? liuweiqcxy@163.com
謝謝!
--劉威
4.?re: log4cxx中文輸出錯誤補丁
評論內容較長,點擊標題查看
--bigbad
5.?re: log4cxx中文輸出錯誤補丁
評論內容較長,點擊標題查看
--bigbad
閱讀排行榜
1.?"multiple definition of" 錯誤(11016)
2.?SVN中邪惡的replace(10938)
3.?VS2005編譯libevent(10404)
4.?混音算法的學習與研究(10183)
5.?C調用lua腳本的效率測試(9003)
評論排行榜
1.?VC6正在被拋棄(35)
2.?VS2005編譯libevent(21)
3.?"multiple definition of" 錯誤(18)
4.?C++引用優于指針(17)
5.?ACE與ASIO之間關于Socket編程的比較(16)
kubernetes導出有狀態服務
kubernetes導出有狀態服務
(金慶的專欄 2018.7)
網游服務器中的房間服務器是有狀態服務器,可以用 kubernetes statefulset 開啟多個實例。
為了讓客戶端能夠直連房間服務器,除了 statefulset 要求的 headless 服務,
還須為每個實例創建 NodePort 類型的服務, 并且選擇Pod和禁止轉發。
下面 bootcamp.yml 先創建了 bootcamp headless 服務(clusterIP: None),
又創建了 bootcamp StatefulSet, 實例個數為 2.
然后創建 bootcamp-0,1,2 服務,分別對應 bootcamp-0,1,2 pod.
服務個數大于實例個數,是想測試下服務沒有對應的實例時的表現。
網游中的匹配服務器將分配一個房間給客戶端,列舉 bootcamp-0,1,2 pod 所在節點的外網 IP,
連同對應服務的端口,發送給客戶端,讓客戶端直連。
[jinqing@host-10-240-79-10 statefulset]$ cat bootcamp.yml
apiVersion: v1
kind: Service
metadata:
name: bootcamp
namespace: jq
labels:
name: bootcamp
spec:
ports:
- port: 8080
clusterIP: None # StatefulSet要求Headless服務
selector:
app: bootcamp # 選擇 bootcamp 應用
---
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: bootcamp
namespace: jq
spec:
serviceName: bootcamp # 上面的 Headless 服務名
replicas: 2
template:
metadata:
labels:
app: bootcamp # 應用名,與服務中的 selector 對應
spec:
containers:
- name: bootcamp
image: docker.io/jocatalin/kubernetes-bootcamp:v1
---
kind: Service
apiVersion: v1
metadata:
name: bootcamp-0
namespace: jq
spec:
type: NodePort # 對外服務
externalTrafficPolicy: Local # 不要轉發到其他節點
selector:
app: bootcamp
statefulset.kubernetes.io/pod-name: bootcamp-0 # 選擇 pod
ports:
- protocol: TCP
nodePort: 30880 # 對外端口
port: 8080
---
kind: Service
apiVersion: v1
metadata:
name: bootcamp-1
namespace: jq
spec:
type: NodePort
externalTrafficPolicy: Local
selector:
app: bootcamp
statefulset.kubernetes.io/pod-name: bootcamp-1
ports:
- protocol: TCP
nodePort: 30881
port: 8080
---
kind: Service
apiVersion: v1
metadata:
name: bootcamp-2
namespace: jq
spec:
type: NodePort
externalTrafficPolicy: Local
selector:
app: bootcamp
statefulset.kubernetes.io/pod-name: bootcamp-2
ports:
- protocol: TCP
nodePort: 30882
port: 8080
因為 statefulset 的每個實例有不同的標簽,所以可以為服務選擇一個實例。
利用 externalTrafficPolicy: Local 設置來禁止轉發。
參考 service.spec.externalTrafficPolicy 的說明:
https://kubernetes.io/docs/tutorials/services/source-ip/#source-ip-for-services-with-type-nodeport
Setting service.spec.externalTrafficPolicy to the value Local will only proxy requests to local endpoints, never forwarding traffic to other nodes and thereby preserving the original source IP address. If there are no local endpoints, packets sent to the node are dropped, ...
因為有可能多個Pod開在同一節點上,所以對外端口設成了不同的 30880-30882。
如果限制每個節點只開一個實例,則對外端口可以設成同一個。
創建服務:
[jinqing@host-10-240-79-10 statefulset]$ kubectl apply -f bootcamp.yml
service "bootcamp" created
statefulset.apps "bootcamp" created
service "bootcamp-0" created
service "bootcamp-1" created
service "bootcamp-2" created
服務如下:
[jinqing@host-10-240-79-10 statefulset]$ kubectl get service -n jq
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
bootcamp ClusterIP None <none> 8080/TCP 3m
bootcamp-0 NodePort 10.96.128.137 <none> 8080:30880/TCP 3m
bootcamp-1 NodePort 10.109.2.56 <none> 8080:30881/TCP 3m
bootcamp-2 NodePort 10.102.181.193 <none> 8080:30882/TCP 3m
2個實例:
[jinqing@host-10-240-79-10 statefulset]$ kubectl get pod -n jq -o wide
NAME READY STATUS RESTARTS AGE IP NODE
bootcamp-0 1/1 Running 0 4m 10.244.0.42 host-10-240-79-10
bootcamp-1 1/1 Running 0 4m 10.244.1.63 host-10-240-79-11
訪問服務必須指定節點,不會自動轉發:
[jinqing@host-10-240-79-10 statefulset]$ curl 10.240.79.10:30880
Hello Kubernetes bootcamp! | Running on: bootcamp-0 | v=1
[jinqing@host-10-240-79-10 statefulset]$ curl 10.240.79.10:30881
curl: (7) Failed connect to 10.240.79.10:30881; Connection timed out
[jinqing@host-10-240-79-10 statefulset]$ curl 10.240.79.11:30880
curl: (7) Failed connect to 10.240.79.11:30880; Connection timed out
[jinqing@host-10-240-79-10 statefulset]$ curl 10.240.79.11:30881
Hello Kubernetes bootcamp! | Running on: bootcamp-1 | v=1
沒有負載均衡,30881端口總是訪問 bootcamp-1:
[jinqing@host-10-240-79-10 statefulset]$ curl 10.240.79.11:30881
Hello Kubernetes bootcamp! | Running on: bootcamp-1 | v=1
[jinqing@host-10-240-79-10 statefulset]$ curl 10.240.79.11:30881
Hello Kubernetes bootcamp! | Running on: bootcamp-1 | v=1
[jinqing@host-10-240-79-10 statefulset]$ curl 10.240.79.11:30881
Hello Kubernetes bootcamp! | Running on: bootcamp-1 | v=1
[jinqing@host-10-240-79-10 statefulset]$ curl 10.240.79.11:30881
Hello Kubernetes bootcamp! | Running on: bootcamp-1 | v=1
[jinqing@host-10-240-79-10 statefulset]$ curl 10.240.79.11:30881
Hello Kubernetes bootcamp! | Running on: bootcamp-1 | v=1
也可以從外網訪問.
30882 端口無法連接:
[jinqing@host-10-240-79-10 statefulset]$ curl 10.240.79.11:30882
curl: (7) Failed connect to 10.240.79.11:30882; Connection refused
[jinqing@host-10-240-79-10 statefulset]$ curl 10.240.79.10:30882
curl: (7) Failed connect to 10.240.79.10:30882; Connection refused
3個端口都有監聽:
[root@host-10-240-79-11 tmp]# netstat -ntl | grep 3088
tcp6 0 0 :::30881 :::* LISTEN
tcp6 0 0 :::30882 :::* LISTEN
tcp6 0 0 :::30880 :::* LISTEN
iptables-save 輸出如下, 其中 10.244是Pod的網段。
沒有實例運行的節點上,會丟棄請求:
-A KUBE-NODEPORTS -s 127.0.0.0/8 -p tcp -m comment --comment "jq/bootcamp-1:" -m tcp --dport 30881 -j KUBE-MARK-MASQ
-A KUBE-NODEPORTS -p tcp -m comment --comment "jq/bootcamp-1:" -m tcp --dport 30881 -j KUBE-XLB-LJXDQ4W47M42IZBH
-A KUBE-NODEPORTS -s 127.0.0.0/8 -p tcp -m comment --comment "jq/bootcamp-0:" -m tcp --dport 30880 -j KUBE-MARK-MASQ
-A KUBE-NODEPORTS -p tcp -m comment --comment "jq/bootcamp-0:" -m tcp --dport 30880 -j KUBE-XLB-U5NEOQT6R5WSBVOH
-A KUBE-XLB-LJXDQ4W47M42IZBH -s 10.244.0.0/16 -m comment --comment "Redirect pods trying to reach external loadbalancer VIP to clusterIP" -j KUBE-SVC-LJXDQ4W47M42IZBH
-A KUBE-XLB-LJXDQ4W47M42IZBH -m comment --comment "jq/bootcamp-1: has no local endpoints" -j KUBE-MARK-DROP
-A KUBE-XLB-U5NEOQT6R5WSBVOH -s 10.244.0.0/16 -m comment --comment "Redirect pods trying to reach external loadbalancer VIP to clusterIP" -j KUBE-SVC-U5NEOQT6R5WSBVOH
-A KUBE-XLB-U5NEOQT6R5WSBVOH -m comment --comment "jq/bootcamp-0: has no local endpoints" -j KUBE-MARK-DROP
有實例運行的節點上會轉發給 Pod 8080:
-A KUBE-NODEPORTS -s 127.0.0.0/8 -p tcp -m comment --comment "jq/bootcamp-0:" -m tcp --dport 30880 -j KUBE-MARK-MASQ
-A KUBE-NODEPORTS -p tcp -m comment --comment "jq/bootcamp-0:" -m tcp --dport 30880 -j KUBE-XLB-U5NEOQT6R5WSBVOH
-A KUBE-NODEPORTS -s 127.0.0.0/8 -p tcp -m comment --comment "jq/bootcamp-1:" -m tcp --dport 30881 -j KUBE-MARK-MASQ
-A KUBE-NODEPORTS -p tcp -m comment --comment "jq/bootcamp-1:" -m tcp --dport 30881 -j KUBE-XLB-LJXDQ4W47M42IZBH
-A KUBE-XLB-LJXDQ4W47M42IZBH -s 10.244.0.0/16 -m comment --comment "Redirect pods trying to reach external loadbalancer VIP to clusterIP" -j KUBE-SVC-LJXDQ4W47M42IZBH
-A KUBE-XLB-LJXDQ4W47M42IZBH -m comment --comment "Balancing rule 0 for jq/bootcamp-1:" -j KUBE-SEP-LJQA4WUIKJUQ5ALU
-A KUBE-XLB-U5NEOQT6R5WSBVOH -s 10.244.0.0/16 -m comment --comment "Redirect pods trying to reach external loadbalancer VIP to clusterIP" -j KUBE-SVC-U5NEOQT6R5WSBVOH
-A KUBE-XLB-U5NEOQT6R5WSBVOH -m comment --comment "jq/bootcamp-0: has no local endpoints" -j KUBE-MARK-DROP
-A KUBE-SEP-LJQA4WUIKJUQ5ALU -s 10.244.1.63/32 -m comment --comment "jq/bootcamp-1:" -j KUBE-MARK-MASQ
-A KUBE-SEP-LJQA4WUIKJUQ5ALU -p tcp -m comment --comment "jq/bootcamp-1:" -m tcp -j DNAT --to-destination 10.244.1.63:8080
30882 端口無法連接
-A KUBE-EXTERNAL-SERVICES -p tcp -m comment --comment "jq/bootcamp-2: has no endpoints" -m addrtype --dst-type LOCAL -m tcp --dport 30882 -j REJECT --reject-with icmp-port-unreachable
測試下擴容:
[jinqing@host-10-240-79-10 statefulset]$ kubectl get statefulset -n jq
NAME DESIRED CURRENT AGE
bootcamp 2 2 45m
[jinqing@host-10-240-79-10 statefulset]$ kubectl scale --replicas=3 statefulset/bootcamp -n jq
statefulset.apps "bootcamp" scaled
[jinqing@host-10-240-79-10 statefulset]$ kubectl get statefulset -n jq
NAME DESIRED CURRENT AGE
bootcamp 3 3 47m
[jinqing@host-10-240-79-10 statefulset]$ kubectl get pod -n jq -o wide
NAME READY STATUS RESTARTS AGE IP NODE
bootcamp-0 1/1 Running 0 48m 10.244.0.42 host-10-240-79-10
bootcamp-1 1/1 Running 0 48m 10.244.1.63 host-10-240-79-11
bootcamp-2 1/1 Running 0 45s 10.244.2.60 host-10-240-79-12
[jinqing@host-10-240-79-10 statefulset]$ curl 10.240.79.12:30882
Hello Kubernetes bootcamp! | Running on: bootcamp-2 | v=1
posted on 2018-07-14 11:43
金慶
閱讀(878)
評論(0)
編輯
收藏
引用
所屬分類:
9. 其它
、
2. 網游開發
只有注冊用戶
登錄
后才能發表評論。
【推薦】100%開源!大型工業跨平臺軟件C++源碼提供,建模,組態!
相關文章:
TortoiseGit is OK but GitExtensions fails
DeathVoteExpirationTimeout in Orleans
How to delete local branches of GitExtension
Clustering provider in Orleans
Why Orleans' actor is virutal
What comes after microservice?
Rust Deref coercion example
Rust Error Return Check Policy
Rust visibility
Why does Rust check borrow even in single thread
網站導航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
Powered by:
C++博客
Copyright © 金慶
.精品久久久麻豆国产精品
|
久久精品亚洲男人的天堂
|
精品久久久无码21p发布
|
亚洲国产精品无码久久久蜜芽
|
色妞色综合久久夜夜
|
国产aⅴ激情无码久久
|
狠狠色婷婷综合天天久久丁香
|
久久夜色撩人精品国产小说
|
久久久久久久久久久
|
久久国产一区二区
|
亚洲国产成人久久精品99
|
国内精品欧美久久精品
|
精品久久久中文字幕人妻
|
999久久久国产精品
|
狠狠色噜噜色狠狠狠综合久久
|
91精品国产高清久久久久久io
|
无码人妻少妇久久中文字幕
|
久久91精品国产91久久户
|
久久久精品人妻一区二区三区蜜桃
|
精品一区二区久久久久久久网站
|
一本久久a久久精品vr综合
|
久久久无码精品午夜
|
精品久久久久久亚洲
|
国产精品一区二区久久国产
|
久久精品国产一区二区三区日韩
|
亚洲va久久久久
|
久久久网中文字幕
|
国产三级观看久久
|
久久伊人精品青青草原高清
|
久久久久高潮毛片免费全部播放
|
女人高潮久久久叫人喷水
|
精品国产一区二区三区久久
|
97久久超碰国产精品旧版
|
欧洲精品久久久av无码电影
|
亚洲国产日韩欧美综合久久
|
久久久不卡国产精品一区二区
|
久久天堂电影网
|
中文字幕一区二区三区久久网站
|
好属妞这里只有精品久久
|
国产精品视频久久久
|
久久中文娱乐网
|