ÕªÒª£ºÔÚ½éÉܲ¿Êð֮ǰÐèÒªÁ˽âµÄÔÀíºÍ¸ÅÄîÖ®ºó£¬±¾ÎÄÒÔÒ»¸ö¼òµ¥µÄnginx·þÎñÀ´Õ¹Ê¾Á˸´ÖÆÆ÷ºÍServiceµÄʹÓã¬Ìرðͨ¹ý¶ÔServiceµÄcluster IPºÍNodePortµÄ·ÖÎö£¬Ê¹µÃ¶ÁÕßÄܹ»Á˽âÕâ¸öÄ£ÐÍÖеÄÍøÂçÌØÐÔ¡£
¡¾±àÕß°´¡¿Kubernetes¿ÉÓÃÀ´¹ÜÀíLinuxÈÝÆ÷¼¯Èº£¬¼ÓËÙ¿ª·¢ºÍ¼ò»¯ÔËά£¨¼´DevOps£©¡£µ«Ä¿Ç°ÍøÂçÉϹØÓÚKubernetesµÄÎÄÕ½éÉÜÐÔÔ¶¶àÓÚʵ¼ÊʹÓᣱ¾ÏµÁÐÎÄÕÂ×ÅÑÛÓÚʵ¼Ê²¿Ê𣬴øÄú¿ìËÙÕÆÎÕKubernetes¡£ÔÚ½éÉܲ¿Êð֮ǰÐèÒªÁ˽âµÄÔÀíºÍ¸ÅÄîÖ®ºó£¬×÷ÕßÔÚ±¾ÎÄÖÐÒÔÒ»¸ö¼òµ¥µÄnginx·þÎñÀ´Õ¹Ê¾Á˸´ÖÆÆ÷ºÍServiceµÄʹÓã¬Ìرðͨ¹ý¶ÔServiceµÄcluster IPºÍNodePortµÄ·ÖÎö£¬Ê¹µÃ¶ÁÕßÄܹ»Á˽âÕâ¸öÄ£ÐÍÖеÄÍøÂçÌØÐÔ¡£
Ò»¸ö¼òµ¥µÄÓ¦ÓÃ
½²ÁËÕâô¶àµÄÔÀíºÍ¸ÅÄ±¾ÕÂÎÒÃǾͲ¿ÊðÒ»¸ö¼òµ¥Ó¦ÓÃÀ´¸ÐÊÜÒ»ÏÂKubernetesµÄ²¿ÊðÄ£ÐÍ¡£
²¿ÊðKubernetes¼¯Èº
ÔÚ kubernetes githubÕ¾µã ÉÏÓÐÊýÊ®ÖÖÕë¶Ô¸÷ÖÖ»·¾³µÄ²¿ÊðÎĵµ£¬±¾ÎÄÑ¡Ôñ»ùÓÚubuntuµÄ¼¯Èº²¿Êð·½°¸¡£ÔÚûÓÐʹÓñ¾µØdocker¾µÏñµÄÇé¿öÏ£¬ÔÚ²¿Êð¹ý³ÌÖÐÐèҪȷ±£Äܹ»·ÃÎÊÕ¾µãgcr.io¡£
»ùÓÚ UbuntuµÄ¼¯Èº²¿Êð·½°¸Îĵµ дµÃ±È½ÏÏêϸ£¬°´ÕÕËüµÄ²½Ö輸ºõ²»»á³ö´í¡£ÔÚ½øÐÐÕæÕýµÄ²¿Êð֮ǰ£¬Ò»¶¨ÒªÈ·±££º
- ËùÓеĽڵ㰲װÁËdocker version 1.2+ ºÍ bridge-utils
-
Èç¹ûûÓб¾µØµÄdocker registry, Ҫȷ±£½ÚµãÄÜ·ÃÎÊ»¥ÁªÍøgcr.io
-
È·±£¹ÜÀí½ÚµãÄܹ»ssh ·ÃÎÊËùÓнڵ㡣±ÈÈçssh gongysh@192.168.0.201 ls
ÕâÀïÎÒÃǼ¯Èº½«²ÉÓÃÏÂͼÏÔʾµÄ½á¹¹¡£ÎÒÃǽ«ÔÚ¹ÜÀí½ÚµãÉÏÔËÐм¯Èº¹ÜÀíÃüÁî¡£ÎÒÃǽ«ÓÐÒ»¸ö·þÎñºÍ´úÀí»ìºÏµÄ½Úµã£¬»¹ÓÐÁ½¸ö´¿µÄ´úÀí½Úµã¡£

Ê×ÏÈÎÒÃÇÒªÏÂÔØkubernetesµÄ´úÂëµ½¹ÜÀí½ÚµãÉÏ£º
$ git clone https://github.com/GoogleCloudPlatform/kubernetes.git |
È»ºó½øÐб¾µØ¹¹½¨£º
cd kubernetes ./build/run.sh hack/build-do.sh |
ÐÞ¸Äconfig-default.sh¶¨Ò弯Ⱥ£¬±¾ÎÄʹÓõö¹Ø¼üÅäÖÃÈçÏÂ:
gongysh@fedora20:~/git/kubernetes/cluster/ubuntu$ cat config-default.sh #!/bin/bash # Define all your cluster nodes, MASTER node comes first" # And separated with blank space like <user_1@ip_1> <user_2@ip_2> <user_3@ip_3> export nodes="gongysh@192.168.0.201 gongysh@192.168.0.202 gongysh@192.168.0.203" # Define all your nodes role: a(master) or i(minion) or ai(both master and minion), must be the order same export roles=("ai" "i" "i") # Define minion numbers export NUM_MINIONS=${NUM_MINIONS:-3} # define the IP range used for service portal. # according to rfc 1918 ref: https://tools.ietf.org/html/rfc1918 choose a private ip range here. export SERVICE_CLUSTER_IP_RANGE=192.168.3.0/24 # define the IP range used for flannel overlay network, should not conflict with above SERVICE_CLUSTER_IP_RANGE range export FLANNEL_NET=172.16.0.0/16 .... |
×îºóÔËÐм¯Èº¹¹½¨ÃüÁ
$ cd cluster $ KUBERNETES_PROVIDER=ubuntu ./kube-up.sh |
µ±Äã¿´µ½£º
Kubernetes cluster is running. The master is running at:
http://192.168.0.201
... calling validate-cluster
Found 3 nodes.
1 NAME LABELS STATUS
2 192.168.0.201 <none> Ready
3 192.168.0.202 <none> Ready
4 192.168.0.203 <none> Ready
Validate output:
Cluster validation succeeded
Done, listing cluster services:
Kubernetes master is running at http://192.168.0.201:8080 |
±íÃ÷¼¯Èº¹¹½¨³É¹¦¡£
²¿ÊðnginxÓ¦ÓÃ
ÎÒÃÇÒÔÏÂÃæµÄͼÀ´°²×°Ò»¸ö¼òµ¥µÄ¾²Ì¬ÄÚÈݵÄnginxÓ¦Óãº

Ê×ÏÈ£¬ÎÒÃÇÓø´ÖÆÆ÷Æô¶¯Ò»¸ö2¸ö±¸·ÝµÄnginx Pod¡£È»ºóÔÚÇ°Ãæ¹ÒService£¬Ò»¸öserviceÖ»Äܱ»¼¯ÈºÄÚ²¿·ÃÎÊ£¬Ò»¸öÄܱ»¼¯ÈºÍâµÄ½Úµã·ÃÎÊ¡£ÏÂÃæËùÓеÄÃüÁî¶¼ÊÇÔÚ¹ÜÀí½ÚµãÉÏÔËÐеġ£
²¿Êðnginx pod ºÍ¸´ÖÆÆ÷
ÈçϱíËùʾ£º
$ cat nginx-rc.yaml apiVersion: v1 kind: ReplicationController metadata: name: nginx-controller spec: replicas: 2 selector: name: nginx template: metadata: labels: name: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 |
ÎÒÃǶ¨ÒåÁËÒ»¸önginx pod¸´ÖÆÆ÷£¬¸´ÖÆ·ÝÊýΪ2£¬ÎÒÃÇʹÓÃnginx docker¾µÏñ¡£
Ö´ÐÐÏÂÃæµÄ²Ù×÷´´½¨nginx pod¸´ÖÆÆ÷:
$ kubectl -s http://192.168.0.201:8080 create -f nginx-rc.yaml |
ÓÉÓÚkubernetesҪȥgcr.ioÏÂÔØgcr.io/google_containers/pause¾µÏñ£¬È»ºóÏÂÔØnginx¾µÏñ£¬ËùÒÔËù´´½¨µÄPodÐèÒªµÈ´ýһЩʱ¼ä²ÅÄÜ´¦ÓÚrunning״̬¡£
$ kubectl -s http://192.168.0.201:8080 get pods NAME READY REASON RESTARTS AGE nginx-controller-6zr34 1/1 Running 0 48m nginx-controller-njlgt 1/1 Running 0 48m |
ÎÒÃÇ¿ÉÒÔʹÓÃdescribe ÃüÁî²é¿´podËù·Öµ½µÄ½Úµã:
$ $ kubectl -s http://192.168.0.201:8080 describe pod nginx-controller-6zr34 2>/dev/null | grep Node: Node: 192.168.0.203/192.168.0.203 $ kubectl -s http://192.168.0.201:8080 describe pod nginx-controller-njlgt 2>/dev/null | grep Node: Node: 192.168.0.201/192.168.0.201 |
´ÓÉϱí¿ÉÒÔ¿´³ö£¬Õâ¸ö¸´ÖÆÆ÷Æô¶¯ÁËÁ½¸öPod£¬·Ö±ðÔËÐÐÔÚ192.168.0.201ºÍ203´úÀí½ÚµãÖ÷»úÉÏ¡£
²¿Êð½ÚµãÄÚ²¿¿É·ÃÎʵÄnginx service
ServiceµÄtypeÓÐClusterIPºÍNodePortÖ®·Ö£¬È±Ê¡ÊÇClusterIP£¬ÕâÖÖÀàÐ͵ÄServiceÖ»ÄÜÔÚ¼¯ÈºÄÚ²¿·ÃÎÊ¡£Ï±íÊDZ¾ÎÄÓõÄÅäÖÃÎļþ£º
$ cat nginx-service-clusterip.yaml apiVersion: v1 kind: Service metadata: name: nginx-service-clusterip spec: ports: - port: 8001 targetPort: 80 protocol: TCP selector: name: nginx |
Ö´ÐÐÏÂÃæµÄÃüÁî´´½¨service:
$ kubectl -s http://192.168.0.201:8080 create -f ./nginx-service-clusterip.yaml services/nginx-service $ kubectl -s http://192.168.0.201:8080 get service NAME LABELS kubernetes component=apiserver, provider=kubernetes nginx-service-clusterip <none> SELECTOR IP(S) PORT(S) <none> 192.168.3.1 443/TCP name=nginx 192.168.3.91 8001/TCP |
ÑéÖ¤serviceµÄ¿É·ÃÎÊÐÔ£º
ÉÏÃæµÄÊä³ö¸æËßÎÒÃÇÕâ¸öServiceµÄCluster IPÊÇ192.168.3.91£¬¶Ë¿ÚÊÇ8001¡£ÏÂÃæÎÒÃÇÑéÖ¤Õâ¸öPortalNet IPµÄ¹¤×÷Çé¿ö£º
$ ssh 192.168.0.202 curl -s 192.168.3.91:8001 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html> |
´ÓÇ°Ãæ²¿Êð¸´ÖÆÆ÷µÄ²¿·ÖÎÒÃÇÖªµÀnginx PodÔËÐÐÔÚ201ºÍ203½ÚµãÉÏ¡£ÉÏÃæÎÒÃÇÌØÒâ´Ó202´úÀí½ÚµãÉÏ·ÃÎÊÎÒÃǵķþÎñÀ´ÌåÏÖService Cluster IPÔÚËùÓм¯Èº´úÀí½ÚµãµÄ¿Éµ½´ïÐÔ¡£
²¿ÊðÍⲿ¿É·ÃÎʵÄnginx service
ÏÂÃæÎÒÃÇ´´½¨NodePortÀàÐ͵ÄService£¬ÕâÖÖÀàÐ͵ÄServiceÔÚ¼¯ÈºÍⲿÊÇ¿ÉÒÔ·ÃÎÊ¡£Ï±íÊDZ¾ÎÄÓõÄÅäÖÃÎļþ£º
$ cat nginx-service-nodeport.yaml apiVersion: v1 kind: Service metadata: name: nginx-service-nodeport spec: ports: - port: 8000 targetPort: 80 protocol: TCP type: NodePort selector: name: nginx |
Ö´ÐÐÏÂÃæµÄÃüÁî´´½¨service:
$ kubectl -s http://192.168.0.201:8080 create -f ./nginx-service-nodeport.yaml services/nginx-service-nodeport $ kubectl -s http://192.168.0.201:8080 get service NAME LABELS kubernetes component=apiserver, provider=kubernetes nginx-service-clusterip <none> nginx-service-nodeport <none>
SELECTOR IP(S) PORT(S) <none> 192.168.3.1 443/TCP name=nginx 192.168.3.91 8001/TCP name=nginx 192.168.3.84 8000/TCP |
ʹÓÃÏÂÃæµÄÃüÁî»ñµÃÕâ¸öserviceµÄ½Úµã¼¶±ðµÄ¶Ë¿Ú£º
$ kubectl -s http://192.168.0.201:8080 describe service nginx-service-nodeport 2> /dev/null | grep NodePort Type: NodePort NodePort: <unnamed> 32606/TCP |
ÑéÖ¤serviceµÄ¿É·ÃÎÊÐÔ£º
ÉÏÃæµÄÊä³ö¸æËßÎÒÃÇÕâ¸öServiceµÄ½Úµã¼¶±ð¶Ë¿ÚÊÇ32606¡£ÏÂÃæÎÒÃÇÑéÖ¤Õâ¸öServiceµÄ¹¤×÷Çé¿ö£º
$ curl 192.168.0.201:32606 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html> |
´úÀí½ÚµãÉϵÄIP tables¹æÔò½âÎö
ÏÂÃæµÄͼÊÇIPTablesÖÐÁ÷Á¿¾¹ýµÄtableºÍchain¡£

¿ÉÒÔ¿´³ö£¬KubernetesÔÚnat±íÖвåÈëÁËÏÂÃæËÄÌõchain£º
1. KUBE-PORTALS-CONTAINER
Õâ¸öchainÖ÷ÒªÊÇ´¦ÀíËùÓÐservice¶ÔÏóµÄcluster IPºÍportµ½kube-proxy±¾µØ¶Ë¿ÚµÄÓ³Éä¡£±ÈÈçÏÂÃæ¹æÔò£º
-A KUBE-PORTALS-CONTAINER -d 192.168.3.84/32 -p tcp -m comment --comment "default/nginx-service-nodeport: " -m tcp --dport 8000 -j REDIRECT --to-ports 43981 |
¾ÍÊÇΪnginx-service-nodeport·þÎñµÄCluster IP×¼±¸µÄ¡£ÆäÖÐ192.168.3.84/32ÊǸ÷þÎñ»ñµÃµÄCluster IP£¬¶Ë¿Ú8000ÊÇÆäÔÚ¶¨ÒåÎļþÖÐÖ¸¶¨µÄspec.ports.port¡£43981ÔòÊÇkube-proxyΪÕâ¸öservice·ÖÅäµÄ±¾µØ¶Ë¿Ú¡£¹æÔòµÄÒâ˼Êǵ½192.168.3.84:8000µÄÁ÷Á¿Öض¨Ïòµ½43981¡£
2. KUBE-NODEPORT-CONTAINER
ÕâÌõchainÉÏÔò´®Á¬×ÅÀàÐÍΪNodePortµÄserviceµÄNodePort¹æÔò¡£±ÈÈçÏÂÃæ¹æÔò£º
-A KUBE-NODEPORT-CONTAINER -p tcp -m comment --comment "default/nginx-service-nodeport: " -m tcp --dport 32606 -j REDIRECT --to-ports 43981 |
¾ÍÊÇΪnginx-service-nodeport·þÎñµÄNodePort 32606×¼±¸µÄ¡£Òâ˼ÊÇ·ÃÎʱ¾µØ32606¶Ë¿ÚµÄÁ÷Á¿ÖØÐ¶¨Ïòµ½43981£¬ºóÕßÊÇkube-proxyΪÕâ¸öservice·ÖÅäµÄ±¾µØ¶Ë¿Ú¡£
3. KUBE-PORTALS-HOST
ÕâÌõchainÉÏÒ²¹ØÁª×Ÿ÷¸öserviceµÄCluster IPºÍPortµÄ¹æÔò£¬±ÈÈ磺
-A KUBE-PORTALS-HOST -d 192.168.3.84/32 -p tcp -m comment --comment " default/nginx-service-nodeport:" -m tcp --dport 8000 -j DNAT --to-destination 192.168.0.201:43981 |
ÕâÌõ¹æÔòÊǺÍKUBE-PORTALS-CONTAINERÀàËÆµÄ£¬Ö»²»¹ýÁ÷Á¿À´×ÔÓÚ±¾µØ½ø³Ì¡£
4. KUBE-NODEPORT-HOST
ÕâÌõchainÉÏÔò¹ØÁª×ÅÀàÐÍΪNodePortµÄserviceµÄNodePort¹æÔò¡£±ÈÈçÏÂÃæ¹æÔò£º
-A KUBE-NODEPORT-HOST -p tcp -m comment --comment "default/nginx-service-nodeport:" -m tcp --dport 30975 -j DNAT --to-destination 192.168.0.201:43981 |
ÕâÌõ¹æÔòÊǺÍKUBE-NODEPORT-CONTAINERÀàËÆµÄ£¬Ö»²»¹ýÁ÷Á¿À´×ÔÓÚ±¾µØ½ø³Ì¡£
×ܽá
±ÊÕßÈÏΪDockerÒѾ²»Êǽö´ú±íÈÝÆ÷±¾Éí£¬¶øÊÇÒ»×éÒÔÓ¦Óò¿ÊðΪÖÐÐĵļ¼Êõ£¬²úÆ·ºÍ×î¼Ñʵ¼ùÉú̬ϵͳ¡£KubernetesÒÔÆä³öÉí£¬ÎĵµµÄ³ÉÊì¶È£¬ÉçÇøµÄÖ§³ÖÔÚÕâ¸öÉú̬ϵͳÖбíÏֵñȽÏÍ»³ö¡£ÔÚ²¿ÊðKubernetesʱ£¬ÎÒÃÇÊ×ÏÈÒªÀí½âKubernetesµÄ×é¼þ½á¹¹£¬ËüÃÇÓÐÄÄЩ½ÇÉ«£¬¸÷¸ö½ÇÉ«µÄ×÷ÓÃÊÇʲôºÍËüÃÇÖ®½ÓµÄͨÐÅ¡£ÔÚÓ¦Óò¿Êðʱ£¬Á˽âKubernetesµÄÓ¦ÓÃÄ£ÐÍÊǷdz£ÖØÒªµÄ¡£±ÊÕßÈÏΪ¸´ÖÆÆ÷ºÍServiceµÄ¸ÅÄîÊÇKubernetesÄ£Ð͵ĺËÐÄ£¬¸´ÖÆÆ÷ºÍService¹²Í¬Íê³ÉÁËÓ¦Óõĸ߿ÉÓÃÐÔÒªÇó¡£×îºó±¾ÎÄÒÔÒ»¸ö¼òµ¥µÄnginx·þÎñÀ´Õ¹Ê¾Á˸´ÖÆÆ÷ºÍServiceµÄʹÓã¬Ìرðͨ¹ý¶ÔServiceµÄcluster IPºÍNodePortµÄ·ÖÎö£¬Ê¹µÃ¶ÁÕßÄܹ»Á˽âÕâ¸öÄ£ÐÍÖеÄÍøÂçÌØÐÔ¡£
×îºó¾ÍÊÇÈÝÆ÷¼¼ÊõµÄÑ¡ÐÍ£¬±¾ÎÄʹÓÃDocker×÷ΪÈÝÆ÷£¬ÆäʵKubernetesÒ²Ö§³ÖCoreOSµÄrktÈÝÆ÷¡£kubeletµÄ²ÎÊý--container_runtimeÓÃÓÚÑ¡ÔñʹÓõÄÈÝÆ÷¼¼Êõ¡£
|