¹È¸èÓÚ2015ÄêÕýÊ½ÍÆ³öµÄKubernetes¿ªÔ´ÏîĿĿǰÒѾÎüÒýÁËÖÚ¶àIT¹«Ë¾µÄ¹Ø×¢£¬ÕâЩ¹«Ë¾°üÀ¨Redhat¡¢CoreOS¡¢IBM¡¢»ÝÆÕµÈÖªÃûIT¹«Ë¾£¬Ò²°üÀ¨¹úÄÚÈ绪Ϊ¡¢Ê±ËÙÔÆµÈ¹«Ë¾¡£ÎªÊ²Ã´Kubernetes»áÒý·¢Õâô¶à¹«Ë¾µÄ¹Ø×¢£¿×î¸ù±¾µÄÔÒòÊÇKubernetesÊÇÐÂÒ»´úµÄ»ùÓÚÏȽøÈÝÆ÷¼¼ÊõµÄ΢·þÎñ¼Ü¹¹Æ½Ì¨£¬Ëü½«µ±Ç°»ð±¬µÄÈÝÆ÷¼¼ÊõÓë΢·þÎñ¼Ü¹¹Á½´óÎüÒýÑÛÇòµÄ¼¼ÊõµãÍêÃÀµÄÈÚΪһÌ壬²¢ÇÒÇÐÇÐʵʵµÄ½â¾öÁË´«Í³·Ö²¼Ê½ÏµÍ³¿ª·¢¹ý³ÌÖг¤ÆÚ´æÔÚµÄÍ´µãÎÊÌâ¡£
±¾ÎļÙÉèÄúÒѾºÜÊìϤ²¢ÕÆÎÕÁËDocker¼¼Êõ£¬ÕâÀï²»»áÔÙ»¨·Ñƪ·ù½éÉÜËü¡£ÕýÊÇͨ¹ýÇáÁ¿¼¶µÄÈÝÆ÷¸ôÀë¼¼Êõ£¬KubernetesʵÏÖÁË¡°Î¢·þÎñ¡±»¯µÄÌØÐÔ£¬Í¬Ê±½èÖúÓÚDockerÌṩµÄ»ù´¡ÄÜÁ¦£¬Ê¹µÃƽ̨µÄ×Ô¶¯»¯ÄÜÁ¦µÃÒÔʵÏÖ¡£
¸ÅÄîÓëÔÀí
×÷Ϊһ¸ö¼Ü¹¹Ê¦À´Ëµ£¬ÎÒÃÇ×öÁËÕâô¶àÄêµÄ·Ö²¼Ê½ÏµÍ³£¬ÆäʵÎÒÃÇÕæÕý¹ØÐĵIJ¢²»ÊÇ·þÎñÆ÷¡¢½»»»»ú¡¢¸ºÔؾùºâÆ÷¡¢¼à¿ØÓ벿ÊðÕâЩÊÂÎÎÒÃÇÕæÕý¹ØÐĵÄÊÇ¡°·þÎñ¡±±¾Éí£¬²¢ÇÒÔÚÄÚÐÄÉî´¦£¬ÎÒÃÇ¿ÊÍûÄÜʵÏÖͼ1ËùʾµÄÏÂÃæµÄÕâ¶Î¡°Ô¸¾°¡±£º
ÎÒµÄϵͳÖÐÓÐServiceA¡¢ServiceB¡¢ServiceCÈýÖÖ·þÎñ£¬ÆäÖÐServiceAÐèÒª²¿Êð3¸öʵÀý¡¢¶øServiceBÓëServiceC¸÷×ÔÐèÒª²¿Êð5¸öʵÀý£¬ÎÒÏ£ÍûÓÐÒ»¸öƽ̨£¨»ò¹¤¾ß£©°ïÎÒ×Ô¶¯Íê³ÉÉÏÊö13¸öʵÀýµÄ·Ö²¼Ê½²¿Ê𣬲¢ÇÒ³ÖÐø¼à¿ØËüÃÇ¡£µ±·¢ÏÖij¸ö·þÎñÆ÷å´»ú»òÕßij¸ö·þÎñʵÀý¹ÊÕϵÄʱºò£¬Æ½Ì¨Äܹ»×ÔÎÒÐÞ¸´£¬´Ó¶øÈ·±£ÔÚÈκÎʱ¼äµã£¬ÕýÔÚÔËÐеķþÎñʵÀýµÄÊýÁ¿¶¼ÊÇÎÒËùÔ¤ÆÚµÄ¡£ÕâÑùÒ»À´£¬ÎÒºÍÎÒµÄÍŶÓÖ»Ðè¹Ø×¢·þÎñ¿ª·¢±¾Éí£¬¶øÎÞÐèÔÙΪͷÌ۵Ļù´¡ÉèÊ©ºÍÔËά¼à¿ØµÄÊÂÇé¶ø·³ÄÕÁË¡£

ͼ1 ·Ö²¼Ê½ÏµÍ³¼Ü¹¹Ô¸¾°
Ö±µ½Kubernetes³öÏÖ֮ǰ£¬Ã»ÓÐÒ»¸ö¹«¿ªµÄƽ̨Éù³ÆÊµÏÖÁËÉÏÃæµÄ¡°Ô¸¾°¡±£¬ÕâÒ»´Î£¬ÓÖÊǹȸèµÄÉñ×÷¾ªÑÞÁËÎÒÃÇ¡£KubernetesÈÃÍŶÓÓиü¶àµÄʱ¼äÈ¥¹Ø×¢ÓëÒµÎñÐèÇóºÍÒµÎñÏà¹ØµÄ´úÂë±¾Éí£¬´Ó¶øÔںܴó³Ì¶ÈÉÏÌáÉýÁËÕû¸öÈí¼þÍŶӵŤ×÷ЧÂÊÓëͶÈë²ú³ö±È¡£
KubernetesÀïºËÐĵĸÅÄîÖ»ÓÐÒÔϼ¸¸ö£º
1.Service
2.Pod
3.Deployments(RC)
Service±íʾҵÎñϵͳÖеÄÒ»¸ö¡°Î¢·þÎñ¡±£¬Ã¿¸ö¾ßÌåµÄService±³ºó¶¼Óзֲ¼ÔÚ¶à¸ö»úÆ÷ÉϵĽø³ÌʵÀýÀ´Ìṩ·þÎñ£¬ÕâЩ½ø³ÌʵÀýÔÚKubernetesÀï±»·âװΪһ¸ö¸öPod£¬Pod»ù±¾µÈͬÓÚDocker
Container£¬ÉÔÓв»Í¬µÄÊÇPodÆäʵÊÇÒ»×éÃÜÇÐÀ¦°óÔÚÒ»Æð²¢ÇÒ¡°Í¬Éú¹²ËÀ¡±µÄDocker Container£¬´ÓÄ£ÐÍÉè¼ÆµÄ½Ç¶ÈÀ´Ëµ£¬µÄÈ·´æÔÚÒ»¸ö·þÎñʵÀýÐèÒª¶à¸ö½ø³ÌÀ´Ìṩ·þÎñ²¢ÇÒËüÃÇÐèÒª¡°ÔÚÒ»Æð¡±
µÄÇé¿ö¡£
KubernetesµÄServiceÓëÎÒÃÇͨ³£Ëù˵µÄ¡°Service¡±ÓÐÒ»¸öÃ÷ÏԵĵIJ»Í¬£¬Ç°ÕßÓÐÒ»¸öÐéÄâIPµØÖ·£¬³ÆÖ®Îª¡°ClusterIP¡±£¬·þÎñÓë·þÎñÖ®¼ä¡°ClusterIP+·þÎñ¶Ë¿Ú¡±µÄ·½Ê½½øÐзÃÎÊ£¬¶øÎÞÐèÒ»¸ö¸´ÔӵķþÎñ·¢ÏÖµÄAPI¡£ÕâÑùÒ»À´£¬Ö»ÒªÖªµÀij¸öServiceµÄClusterIP£¬¾ÍÄÜÖ±½Ó·ÃÎʸ÷þÎñ£¬Îª´Ë£¬KubernetesÌṩÁËÁ½ÖÖ·½Ê½À´½â¾öClusterIPµÄ·¢ÏÖÎÊÌ⣺
µÚÒ»ÖÖ·½Ê½ÊÇͨ¹ý»·¾³±äÁ¿£¬±ÈÈçÎÒÃǶ¨ÒåÁËÒ»¸öÃû³ÆÎªORDER_SERVICE
µÄService £¬·ÖÅäµÄClusterIPΪ10.10.0.3 £¬ÔòÔÚÿ¸ö·þÎñʵÀýµÄÈÝÆ÷ÖУ¬»á×Ô¶¯Ôö¼Ó·þÎñÃûµ½ClusterIPÓ³ÉäµÄ»·¾³±äÁ¿£ºORDER_SERVICE_SERVICE_HOST=10.10.0.3£¬ÓÚÊdzÌÐòÀï¿ÉÒÔͨ¹ý·þÎñÃû¼òµ¥»ñµÃ¶ÔÓ¦µÄClusterIP¡£
µÚ¶þÖÖ·½Ê½ÊÇͨ¹ýDNS£¬ÕâÖÖ·½Ê½Ï£¬Ã¿¸ö·þÎñÃûÓëClusterIPµÄÓ³Éä¹ØÏµ»á±»×Ô¶¯Í¬²½µ½Kubernetes¼¯ÈºÀïÄÚÖõÄDNS×é¼þÀÓÚÊÇÖ±½Óͨ¹ý¶Ô·þÎñÃûµÄDNS
Lookup»úÖÆ¾ÍÕÒµ½¶ÔÓ¦µÄClusterIPÁË£¬ÕâÖÖ·½Ê½¸ü¼ÓÖ±¹Û¡£
ÓÉÓÚKubernetesµÄServiceÕâÒ»¶ÀÌØÉè¼ÆÊµÏÖ˼·£¬Ê¹µÃËùÓÐÒÔTCP
/IP ·½Ê½½øÐÐͨÐŵķֲ¼Ê½ÏµÍ³¶¼Äܼܺòµ¥µÄÇ¨ÒÆµ½Kubernetesƽ̨ÉÏÁË¡£Èçͼ2Ëùʾ£¬µ±¿Í»§¶Ë·ÃÎÊij¸öServiceµÄʱºò£¬KubernetesÄÚÖõÄ×é¼þkube-proxy͸Ã÷µÄʵÏÖÁ˵½ºó¶ËPodµÄÁ÷Á¿¸ºÔؾùºâ¡¢»á»°±£³Ö¡¢¹ÊÕÏ×Ô¶¯»Ö¸´µÈ¸ß¼¶ÌØÐÔ¡£

ͼ2 Kubernetes¸ºÔؾùºâÔÀí
KubernetesÊÇÈçºÎ°ó¶¨ServiceÓëPodµÄÄØ£¿ËüÈçºÎÇø·ÖÄÄЩPod¶ÔӦͬһ¸öService£¿´ð°¸Ò²ºÜ¼òµ¥¡ª¡ª¡°Ìù±êÇ©¡±¡£Ã¿¸öPod¶¼¿ÉÒÔÌùÒ»¸ö»ò¶à¸ö²»Í¬µÄ±êÇ©£¨Label£©£¬¶øÃ¿¸öService¶¼Ò»¸ö¡°±êǩѡÔñÆ÷¡±£¬±êǩѡÔñÆ÷£¨Label
Selector£©È·¶¨ÁËҪѡÔñÓµÓÐÄÄЩ±êÇ©µÄ¶ÔÏ󣬱ÈÈçÏÂÃæÕâ¶ÎYAML¸ñʽµÄÄÚÈݶ¨ÒåÁËÒ»¸ö³ÆÖ®Îªku8-redis-masterµÄService£¬ËüµÄ±êǩѡÔñÆ÷µÄÄÚÈÝΪ¡°app:
ku8-redis-master¡±£¬±íÃ÷ÓµÓС°app= ku8-redis-master¡±Õâ¸ö±êÇ©µÄPod¶¼ÊÇΪËü·þÎñµÄ¡£
apiVersion: v1 kind: Service metadata: name: ku8-redis-master spec: ports: - port: 6379 selector: app: ku8-redis-master |
ÏÂÃæÊǶÔÓ¦µÄPodµÄ¶¨Ò壬עÒâµ½ËüµÄlabelsÊôÐÔµÄÄÚÈÝ£º
apiVersion: v1 kind: Pod metadata: name: ku8-redis-master labels: app: ku8-redis-master spec: containers: - name: server image: redis ports: - containerPort: 6379 restartPolicy: Never |
×îºó£¬ÎÒÃÇÀ´¿´¿´Deployment/RCµÄ¸ÅÄËüµÄ×÷ÓÃÊÇÓÃÀ´¸æËßKubernetes£¬Ä³ÖÖÀàÐ͵ÄPod£¨ÓµÓÐij¸öÌØ¶¨±êÇ©µÄPod£©ÐèÒªÔÚ¼¯ÈºÖд´½¨¼¸¸ö¸±±¾ÊµÀý£¬Deployment/RCµÄ¶¨ÒåÆäʵÊÇPod´´½¨Ä£°å£¨Template£©+Pod¸±±¾ÊýÁ¿µÄÉùÃ÷£¨replicas£©£º
apiVersion: v1 kind: ReplicationController metadata: name: ku8-redis-slave spec: replicas: 2 template: metadata: labels: app: ku8-redis-slave spec: containers: - name: server image: devopsbq/redis-slave env: - name: MASTER_ADDR value: ku8-redis-master ports: - containerPort: 6379 |
Kubernetes¿ª·¢Ö¸ÄÏ
±¾½ÚÎÒÃÇÒÔÒ»¸ö´«Í³µÄJavaÓ¦ÓÃΪÀý£¬À´ËµÃ÷ÈçºÎ½«Æä¸ÄÔìÇ¨ÒÆµ½KubernetesµÄÏȽøÎ¢·þÎñ¼Ü¹¹Æ½Ì¨ÉÏÀ´¡£
Èçͼ3Ëùʾ£¬ÎÒÃǵÄÕâ¸öʾÀý³ÌÐòÊÇÒ»¸öÅÜÔÚTomcatÀïµÄWebÓ¦Óã¬ÎªÁ˼ò»¯£¬Ã»ÓÐÓÃÈκοò¼Ü£¬Ö±½ÓÔÚJSPÒ³ÃæÀïͨ¹ýJDBC²Ù×÷Êý¾Ý¿â¡£

ͼ3 ´ý¸ÄÔìµÄJava WebÓ¦ÓÃ
ÉÏÊöϵͳÖУ¬ÎÒÃǽ«MySQL·þÎñÓëWebÓ¦Ó÷ֱð½¨Ä£ÎªKubernetesÖеÄÒ»¸öService£¬ÆäÖÐMySQL·þÎñµÄService¶¨ÒåÈçÏ£º
apiVersion: v1 kind: Service metadata: name: mysql spec: ports: - port: 3306 selector: app: mysql_pod |
MySQL·þÎñ¶ÔÓ¦µÄDeployment/RCµÄ¶¨ÒåÈçÏ£º
apiVersion: v1 kind: ReplicationController metadata: name: mysql-deployment spec: replicas: 1 template: metadata: labels: app: mysql_pod spec: containers: - name: mysql image: mysql imagePullPolicy: IfNotPresent ports: - containerPort: 3306 env: - name: MYSQL_ROOT_PASSWORD value: "123456" |
ÏÂÒ»²½£¬ÎÒÃÇÐèÒª¸ÄÔìWebÓ¦ÓÃÖлñÈ¡MySQLµØÖ·µÄÕâ¶Î´úÂ룬´ÓÈÝÆ÷µÄ»·¾³±äÁ¿ÖлñÈ¡ÉÏÊöMySQL·þÎñµÄIPÓëPort£º
String ip=System.getenv("MYSQL_SERVICE_HOST"); String port=System.getenv("MYSQL_SERVICE_PORT"); ip=(ip==null)?"localhost":ip; port=(port==null)?"3306":port; conn = java.sql.DriverManager.getConnection("jdbc:mysql://"+ip+":"+port+"?useUnicode=true&characterEncoding=UTF-8", "root","123456"); |
½ÓÏÂÀ´£¬½«´ËWebÓ¦Óôò°üΪһ¸ö±ê×¼µÄDocker¾µÏñ£¬Ãû×ÖΪk8s_myweb_image£¬Õâ¸ö¾µÏñÖ±½Ó´Ó¹Ù·½Tomcat¾µÏñÉÏÌí¼ÓÎÒÃǵÄWebÓ¦ÓÃĿ¼demoµ½webappsĿ¼Ï¼´¿É£¬Dockerfile±È½Ï¼òµ¥£¬ÈçÏÂËùʾ£º
FROM tomcat MAINTAINER bestme <bestme@hpe.com> ADD demo /usr/local/tomcat/webapps/demo |
ÀàËÆÖ®Ç°µÄMySQL·þÎñ¶¨Ò壬ÏÂÃæÊÇÕâ¸öWebÓ¦ÓõÄService¶¨Ò壺
apiVersion: v1 kind: Service metadata: name: hpe-java-web spec: type: NodePort ports: - port: 8080 nodePort: 31002 selector: app: hpe_java_web_pod |
ÎÒÃÇ¿´µ½ÕâÀïÓÃÁËÒ»¸öÌØÊâµÄÓï·¨£ºNodePort£¬²¢ÇÒ¸³ÖµÎª31002£¬´ÊÓï·¨µÄ×÷ÓÃÊÇÈôËWebÓ¦ÓÃÈÝÆ÷ÀïµÄ8080¶Ë¿Ú±»NATÓ³Éäµ½kuberntetesÀïÿ¸öNodeÉϵÄ31002¶Ë¿Ú£¬´Ó¶øÎÒÃÇ¿ÉÒÔÓÃNodeµÄIPºÍ¶Ë¿Ú31002À´·ÃÎÊTomcatµÄ8080¶Ë¿Ú£¬±ÈÈçÎÒ±¾»úµÄ¿ÉÒÔͨ¹ýhttp://192.168.18.137:31002/demo/À´·ÃÎÊÕâ¸öWebÓ¦Óá£
ÏÂÃæÊÇWebÓ¦ÓõÄService¶ÔÓ¦µÄDeployment/RCµÄ¶¨Ò壺
apiVersion: v1 kind: ReplicationController metadata: name: hpe-java-web-deployement spec: replicas: 1 template: metadata: labels: app: hpe_java_web_pod spec: containers: - name: myweb image: k8s_myweb_image imagePullPolicy: IfNotPresent ports: - containerPort: 8080 |
¶¨ÒåºÃËùÓÐServiceÓë¶ÔÓ¦µÄDeployment/RCÃèÊöÎļþºó£¨×ܹ²4¸öyamlÎļþ£©£¬ÎÒÃÇ¿ÉÒÔͨ¹ýKubernetesµÄÃüÁîÐй¤¾ßkubectrl
¨Cf create xxx.yamlÌá½»µ½¼¯ÈºÀÈç¹ûÒ»ÇÐÕý³££¬Kubernetes»áÔÚ¼¸·ÖÖÓÄÚ×Ô¶¯Íê³É²¿Êð£¬Äã»á¿´µ½Ïà¹ØµÄ×ÊÔ´¶ÔÏó¶¼ÒѾ´´½¨³É¹¦£º
-bash-4.2# kubectl get svc NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE hpe-java-web 10.254.183.22 nodes 8080/TCP 36m kubernetes 10.254.0.1 <none> 443/TCP 89d mysql 10.254.170.22 <none> 3306/TCP 36m -bash-4.2# kubectl get pods NAME READY STATUS RESTARTS AGE hpe-java-web-deployement-q8t9k 1/1 Running 0 36m mysql-deployment-5py34 1/1 Running 0 36m -bash-4.2# kubectl get rc NAME DESIRED CURRENT AGE hpe-java-web-deployement 1 1 37m mysql-deployment 1 1 37m |
½áÊøÓï
´ÓÉÏÃæ²½ÖèÀ´¿´£¬´«Í³Ó¦ÓÃÇ¨ÒÆ¸ÄÔìµ½KubernetesÉÏ»¹ÊDZȽÏÈÝÒ׵쬶ø½èÖúÓÚKubernetesµÄÓÅÊÆ£¬¼´Ê¹Ò»¸öСµÄ¿ª·¢ÍŶӣ¬Ò²ÄÜÔÚϵͳ¼Ü¹¹ºÍÔËάÄÜÁ¦ÉÏѸËÙ½Ó½üÒ»¸ö´óµÄÑз¢ÍŶӵÄˮƽ¡£
´ËÍ⣬ΪÁ˽µµÍKubernetesµÄÓ¦ÓÃÃż÷£¬ÎÒÃÇ£¨»ÝÆÕÖйúCMSÑз¢ÍŶӣ©¿ªÔ´ÁËÒ»¸öKubernetesµÄ¹ÜÀíÆ½Ì¨Ku8
eye£¬ÏîÄ¿µØÖ·Îªhttps://github.com/bestcloud/ku8eye£¬Ku8 eyeºÜÊʺÏÓÃ×÷ΪС¹«Ë¾µÄÄÚ²¿PaaSÓ¦ÓùÜÀíÆ½Ì¨£¬Æä¹¦Äܼܹ¹ÀàËÆÍ¼4ËùʾµÄKu8
ManagerÆóÒµ°æ£¬Ku8 eye²ÉÓÃJava¿ª·¢Íê³É£¬ÊÇĿǰΨһһ¸ö¿ªÔ´µÄKubernetesͼÐλ¯¹ÜÀíϵͳ£¬Ò²Ï£Íû¸ü¶à°®ºÃ¿ªÔ´ºÍÓÐÄÜÁ¦µÄͬÐвÎÓë½øÀ´£¬½«Ëü´òÔì³ÉΪ¹úÄÚ×îºÃµÄÔÆ¼ÆËãÁìÓòµÄ¿ªÔ´Èí¼þ¡£

ͼ4 »ùÓÚKubernetesµÄPaaSƽ̨¼Ü¹¹
|