首页 文章 精选 留言 我的

精选列表

搜索[快速],共10000篇文章
优秀的个人博客,低调大师

Kubernetes中,通过Service访问Pod快速入门

一.背景 理想状态下,我们可以认为Kubernetes Pod是健壮的。但是,理想与现实的差距往往是非常大的。很多情况下,Pod中的容器可能会因为发生故障而死掉。Deployment等Controller会通过动态创建和销毁Pod来保证应用整体的健壮性。众所周知,每个pod都拥有自己的IP地址,当新的Controller用新的Pod替代发生故障的Pod时,我们会发现,新的IP地址可能跟故障的Pod的IP地址可能不一致。此时,客户端如何访问这个服务呢?Kubernetes中的Service应运而生。 二.实践步骤 2.1 创建Deployment:httpd。 Kubernetes Service 逻辑上代表了一组具有某些label关联的Pod,Service拥有自己的IP,这个IP是不变的。无论后端的Pod如何变化,Service都不会发生改变。创建YAML如下: apiVersion: apps/v1beta1 kind: Deployment metadata: name: httpd spec: replicas: 4 template: metadata: labels: run: httpd spec: containers: - name: httpd image: httpd ports: - containerPort: 80 配置命令: [root@k8s-m ~]# kubectl apply -f Httpd-Deployment.yaml deployment.apps/httpd created 稍后片刻: [root@k8s-m ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE httpd-79c4f99955-dbbx7 1/1 Running 0 7m32s 10.244.2.35 k8s-n2 <none> httpd-79c4f99955-djv44 1/1 Running 0 7m32s 10.244.1.101 k8s-n1 <none> httpd-79c4f99955-npqxz 1/1 Running 0 7m32s 10.244.1.102 k8s-n1 <none> httpd-79c4f99955-vkjk6 1/1 Running 0 7m32s 10.244.2.36 k8s-n2 <none> [root@k8s-m ~]# curl 10.244.2.35 <html><body><h1>It works!</h1></body></html> [root@k8s-m ~]# curl 10.244.2.36 <html><body><h1>It works!</h1></body></html> [root@k8s-m ~]# curl 10.244.1.101 <html><body><h1>It works!</h1></body></html> [root@k8s-m ~]# curl 10.244.1.102 <html><body><h1>It works!</h1></body></html> 2.2 创建Service:httpd-svc。 创建YAML如下: apiVersion: v1 kind: Service metadata: name: httpd-svc spec: selector: run: httpd ports: - protocol: TCP port: 8080 targetPort: 80 配置完成并观察: [root@k8s-m ~]# kubectl apply -f Httpd-Service.yaml service/httpd-svc created [root@k8s-m ~]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE httpd-svc ClusterIP 10.110.212.171 <none> 8080/TCP 14s kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 11d [root@k8s-m ~]# curl 10.110.212.171:8080 <html><body><h1>It works!</h1></body></html> [root@k8s-m ~]# kubectl describe service httpd-svc Name: httpd-svc Namespace: default Labels: <none> Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"httpd-svc","namespace":"default"},"spec":{"ports":[{"port":8080,"... Selector: run=httpd Type: ClusterIP IP: 10.110.212.171 Port: <unset> 8080/TCP TargetPort: 80/TCP Endpoints: 10.244.1.101:80,10.244.1.102:80,10.244.2.35:80 + 1 more... Session Affinity: None Events: <none> 从以上内容中的Endpoints可以看出服务httpd-svc下面包含我们指定的labels的Pod,cluster-ip通过iptables成功映射到Pod IP,成功。再通过iptables-save命令看一下相关的iptables规则。 [root@k8s-m ~]# iptables-save |grep "10.110.212.171" -A KUBE-SERVICES ! -s 10.244.0.0/16 -d 10.110.212.171/32 -p tcp -m comment --comment "default/httpd-svc: cluster IP" -m tcp --dport 8080 -j KUBE-MARK-MASQ -A KUBE-SERVICES -d 10.110.212.171/32 -p tcp -m comment --comment "default/httpd-svc: cluster IP" -m tcp --dport 8080 -j KUBE-SVC-RL3JAE4GN7VOGDGP [root@k8s-m ~]# iptables-save|grep -v 'default/httpd-svc'|grep 'KUBE-SVC-RL3JAE4GN7VOGDGP' :KUBE-SVC-RL3JAE4GN7VOGDGP - [0:0] -A KUBE-SVC-RL3JAE4GN7VOGDGP -m statistic --mode random --probability 0.25000000000 -j KUBE-SEP-R5YBMKYSG56R4KDU -A KUBE-SVC-RL3JAE4GN7VOGDGP -m statistic --mode random --probability 0.33332999982 -j KUBE-SEP-7G5ANBWSVVLRNZAH -A KUBE-SVC-RL3JAE4GN7VOGDGP -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-2PT6QZGNQHS4OL4I -A KUBE-SVC-RL3JAE4GN7VOGDGP -j KUBE-SEP-I4PXZ6UARQLLOV4E 我们可以进一步查看相关的转发规则,此处省略。iptables将访问Service的流量转发到后端Pod,使用类似于轮询的的负载均衡策略。 2.3 通过域名访问Service。 我们的平台是通过kubeadm部署的,版本是v1.12.1,这个版本自带的dns相关组件是coredns。 [root@k8s-m ~]# kubectl get deployment --namespace=kube-system NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE coredns 2 2 2 2 17d 通过创建一个临时的隔离环境来验证一下DNS是否生效。 [root@k8s-m ~]# kubectl run -it --rm busybox --image=busybox /bin/sh kubectl run --generator=deployment/apps.v1beta1 is DEPRECATED and will be removed in a future version. Use kubectl create instead. If you don't see a command prompt, try pressing enter. / # wget httpd-svc.default:8080 Connecting to httpd-svc.default:8080 (10.110.212.171:8080) index.html 100% |*******************************************************************************************************************************| 45 0:00:00 ETA / # cat index.html <html><body><h1>It works!</h1></body></html> 顺便提一下,在未来版本中,kubectl run可能不再被支持,推荐使用kubectl create替代。此处偷了个懒,后续不建议如此操作。 在以上例子中,临时的隔离环境的namespace为default,与我们新建的httpd-svc都在同一namespace内,httpd-svc.default的default可以省略。如果跨namespace访问的话,那么namespace是不能省略的。 2.4 外网访问Service。 通常情况下,我们可以通过四种方式来访问Kubeenetes的Service,分别是ClusterIP,NodePort,Loadbalance,ExternalName。在此之前的实验都是基于ClusterIP的,集群内部的Node和Pod均可通过Cluster IP来访问Service。NodePort是通过集群节点的静态端口对外提供服务。接下来我们将以NodePort为例来进行实际演示。修改之后的Service的YAML如下: apiVersion: v1 kind: Service metadata: name: httpd-svc spec: type: NodePort selector: run: httpd ports: - protocol: TCP nodePort: 31688 port: 8080 targetPort: 80 配置后观察: [root@k8s-m ~]# kubectl apply -f Httpd-Service.yaml service/httpd-svc configured [root@k8s-m ~]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE httpd-svc NodePort 10.110.212.171 <none> 8080:31688/TCP 117m kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 12d Service httpd-svc的端口被映射到了主机的31688端口。YAML文件如果不指定nodePort的话,Kubernetes会在30000-32767范围内为Service分配一个端口。此刻我们就可以通过浏览器来访问我们的服务了。在与node网络互通的环境中,通过任意一个Node的IP:31688即可访问刚刚部署好的Service。 三.总结 这些天一直在看kubernetes相关的书籍和文档,也一直在测试环境中深度体验kubernetes带来的便捷,感触良多,综合自己的实践写下了这篇文章,以便后期温习。距离生产环境上线的时间越来越近,希望在生产环境上线之前吃透kubernetes。 学习任何新东西都必须静下心来,光看还不够,还要结合适量的实际操作。操作完成之后要反复思考,总结,沉淀,这样才能成长。 Kubernetes确实是一个比较复杂的系统,概念很多,也比较复杂,在操作之前需要把基本概念理解清楚。 四.参考资料 Kubernetes官方文档

优秀的个人博客,低调大师

如何快速开发一个IM系统

本文将会给大家介绍如何开发一个简单的即时通讯系统(IM)。 为什么不简单 我们的站点加一个即时通讯(IM)的功能,那么我们怎么做? 在回家的路上,问了同是实习生(网络方向)的舍友这样一个问题,他回答:“很简单,只需要在服务端保存一个list,收到一个人的message后,我转发给list中指定的另一个人就好啦” 接着,我们讨论了一晚上下面的几个问题 对方不在线怎么办? 内存里保存list的话,人多了怎么办? 怎么查看历史记录?怎么多端同步数据? 为什么微信用户只能建立有限个群,并且群聊功能很晚才开放?为什么微信好友数是有上线的? 怎么保证消息有序、不丢失数据? 如何保证消息的时效性? 如何承担高并发流量? 最后讨论的结果是:开发一个稳定高效的IM产品是相对困难的,上面这些难题,QQ、微信等产品都遇到过。而且IM产品一旦量达到一定程度,性能、稳定性、可用性

优秀的个人博客,低调大师

Linux下快速配置Java开发环境

1.下载 jdk8官网下载地址 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 我的百度云下载地址, 链接:https://pan.baidu.com/s/11Z37_qsdT5UtPqQe_nVnig 密码:r50o, 一直用,稳定性没的说! 先点一下接受,再选择对应版本下的包。我的是CentOS7.3/7.4, 选择tar.gz压缩包。 2.上传 把下载的压缩包上传到你的Linux服务器。 推荐工具 WinScp 直接拖拽上传! 3.命令 推荐下载Putty搭配WinScp超级爽!或者其他Shell软件都可以(XShell等等) 接下来假设你已经把jdk压缩包上传到服务器了,并假设存放在/usr/local/java/jdk8.tar.gz 1.进入jdk存放目录 cd /usr/local/java 2.查看 ls 3.解压 tar -zxvf jdk8.tar.gz 4.编辑 vi /etc/profile 光标移到最后,新系统是没有export xxxxx等,按一下i进入写入模式。 5.在下面添加下面这段 export JAVA_HOME=/usr/local/java/jdk1.8 export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=${JAVA_HOME}/bin:$PATH 再按下esc,输入:wq保存并退出! 6.设置立即生效 source /etc/profile 7.验证 java -version 出现如下所示信息即为安装成功 java version "1.8.0_144" Java(TM) SE Runtime Environment (build 1.8.0_144-b01) Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode) Create By yster@foxmail.com 转载注明出处

优秀的个人博客,低调大师

设计模式快速学习(三)单例模式

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 优点 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。 2、避免对资源的多重占用(比如写文件操作)。 缺点 没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。 实现方式一:懒汉式(线程不安全) 懒汉式:就是用的时候再进行实例化对象。 public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 这种实现方式不支持多线程,因为没有同步锁,多线程下不能正常工作。 实现方式二:懒汉式(线程安全) public class Singleton { private static Singleton instance; public static synchronized Singleton getInstance(){ if (instance == null){ instance = new Singleton(); } return instance; } } 可以在多线程环境下使用,但是效率太低。 优点:一个对象初始化一次,节省内存。缺点:必须用synchronized来维持单例,没效率。 实现方式三:饿汉式(线程安全) public class Singleton { private static Singleton instance = new Singleton(); public static Singleton getInstance(){ return instance; } } 因为它作为静态资源,所以在类装载时就被实例化 优点:没有加锁,执行效率会提高。缺点:类加载时就初始化,浪费内存。 实现方式四:双检锁/双重校验锁DCL(线程安全) public class Singleton { private static Singleton instance; public static Singleton getInstance(){ if (instance == null){ synchronized (Singleton.class){ if (instance == null){ instance = new Singleton(); } } } return instance; } } 采用双锁机制,安全且在多线程情况下能保持高性能。详细了解请点击:Java并发编程 -- 单例模式线程安全问题 实现方式五:登记式/静态内部类(线程安全) public class Singleton { private static Singleton instance; private static class SingletonHandler{ private static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance(){ return SingletonHandler.INSTANCE; } } 这种方式可以说是恶汉式的变通版,SingletonHandler没有被主动使用的情况下是不会实例化Singleton对象的,所以这样做,既能达到lazy式的加载,又能保证线程安全。 实现方式六:枚举类(线程安全) public enum Singleton { INSTANCE; public void myMethod() { System.out.println("enum instance test"); } } 它不仅能避免多线程同步问题,而且还自动支持序列化机制,防止反序列化重新创建新的对象,绝对防止多次实例化。 测试: public class Main { public static void main(String[] args) { Singleton singleton = Singleton.INSTANCE; singleton.myMethod(); } } enum instance test 总结 不建议使用第 1 种和第 2 种懒汉方式,建议使用第 3 种饿汉方式。只有在要明确实现 lazy loading 效果时,才会使用第 5 种登记方式。如果涉及到反序列化创建对象时,可以尝试使用第 6 种枚举方式。

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。