一、概述
1、我们说过,k8s的可用插件有很多,除了flannel之外,还有一个流行的叫做calico的组件,不过calico在很多项目中都会有这个名字被应用,所以他们把自己称为project calico,但是很多时候我们在kubernets的语境中通常会单独称呼他为calico。其本身支持bgp的方式来构建pod网络。通过bgp协议的路由学习能使得去每一节点上生成到达另一节点上pod之间的路由表信息。会在变动时自动执行改变和修改,另外其也支持IP-IP,就是基于IP报文来承载一个IP报文,不像我们VXLAN是通过一个所谓的以太网帧来承载另外一个以太网帧的报文的方式来实现的。因此从这个角度来讲他是一个三层隧道,也就意外着说如果我们期望在calico的网络中实现隧道的方式进行应用,来实现更为强大的控制逻辑,他也支持隧道,不过他是IP-IP隧道,和LVS中所谓的IP-IP的方式很相像。不过calico的配置依赖于我们对bgp等协议的理解工作起来才能更好的去了解他。我们这儿就不再讲calico怎么去作为网络插件去提供网络功能的,而是把他重点集中在calico如何去提供网络策略。因为flannel本身提供不了网络策略。而flannel和calico二者本身已经合二为一了,即canel。事实上,就算我们此前不了解canel的时候类似于使用kubectl的提示根据很多文章的提示直接安装并部署了flannel这样的网络插件都想把flannel换掉。但在这基础之上我们又想去使用网络策略。其实也是有解决方案的,我们可以在flannel提供网络功能的基础之上在额外去给他提供calico去提供网络策略。
2、在实现部署之前要先知道,calico默认使用的网段不是10.244.0.0,如果要拿calico作为网络插件使用的话它工作于192.168.0.0网络。而且是16位掩码。每一个节点网络分配是按照192.168.0.0/24,192.168.1.0/24来分配的。但此处我们不把其当做网络插件提供者而是当做网络策略提供者,我们仍然使用10.244.0.0网段。
二、安装calico
1、可以在官方文档中看到calico有多种安装方式(目前为止calico还不支持ipvs模式)
2、安装教程链接https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/flannel
3、calico新版本中部署比较复杂,calico对集群节点的所有的地址分配都没有自己介入,而是需要依赖于etcd来介入,这就比较麻烦了,首先,大家知道我们k8s自己有etcd database,而calico也需要etcd database,它是两套集群,各自是各自的etcd,这样子分裂起来进行管理来讲对我们k8s工程师都不是一个轻松的事情,那我们应该怎么做呢?后来的calico也支持不把数据放在自己专用的etcd集群中,而是掉apiserver的功能,直接把所有的设置都发给apiserver,由apiserver再存储在etcd中,因为整个k8s集群任何节点的功能,任何组件都不能直接写k8s的etcd,必须apiserver写,主要是确保数据一致性。这样一来也就意外着说我们calico部署有两种方式。第一就是和k8s的etcd分开;第二,直接使用k8s的etcd,不过是要通过apiserver去调用。这儿我们直接使用第二种方式部署。官网对部署方式描述如下
Installing with the Kubernetes API datastore (recommended)
Ensure that the Kubernetes controller manager has the following flags set:
--cluster-cidr=10.244 .0.0 /16 and --allocate-node-cidrs=true .
Tip: If you’re using kubeadm, you can pass --pod-network-cidr=10.244 .0.0 /16 to kubeadm to set the Kubernetes controller flags.
If your cluster has RBAC enabled, issue the following command to configure the roles and bindings that Calico requires.
kubectl apply -f \
https: // docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/canal/rbac.yaml
Note: You can also view the manifest in your browser.
Issue the following command to install Calico.
kubectl apply -f \
https: // docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/canal/canal.yaml
Note: You can also view the manifest in your browser.
4、现在我们来部署
a、首先我们部署一个rbac.yaml配置文件
[root@k8smaster flannel]# kubectl apply -f https:// docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/canal/rbac.yaml
clusterrole.rbac.authorization.k8s.io/calico created
clusterrole.rbac.authorization.k8s.io /flannel configured
clusterrolebinding.rbac.authorization.k8s.io /canal-flannel created
clusterrolebinding.rbac.authorization.k8s.io /canal-calico created
b、第二步我们部署canal.yaml
[root@k8smaster flannel]# kubectl apply -f \
> https:// docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/canal/canal.yaml
configmap/canal-config created
daemonset.extensions /canal created
customresourcedefinition.apiextensions.k8s.io /felixconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io /bgpconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io /ippools.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io /clusterinformations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io /globalnetworkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io /networkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io /globalnetworksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io /hostendpoints.crd.projectcalico.org created
c、接下来我们来看一下对应的组件是否已经启动起来了
三、canel的使用
1、部署完canel后我们怎么去控制我们对应的pod间通信呢?现在我们在我们的cluster上创建两个namespaces,一个叫dev,一个叫pro,然后在两个名称空间中创建两个pod,我们看看两个名称空间中跨名称空间通信能不能直接进行,如果能进行的话我们如何让他不能进行。并且我们还可以这样来设计,我们可以为一个名称空间设置一个默认通信策略,任何到达此名称空间的通信流量都不被允许。简单来讲我们所用的网络控制策略是通过这种方式来定义的。如图,我们网络控制策略(Network Policy)他通过Egress或Ingress规则分别来控制不同的通信需求,什么意思呢?Egress即出栈的意思,Ingress即入栈的意思(此处Ingress和我们k8sIngress是两回事)。Egress表示我们pod作为客户端去访问别人的。即自己作为源地址对方作为目标地址来进行通信,Ingress表示自己是目标,远程是源。所以我们要控制这两个方向的不同的通信,而控制Egress的时候客户端端口是随机的而服务端端口是固定的,因此作为出栈的时候去请求别人很显然对方是服务端,对方的端口可预测,对方的地址也可预测,但自己的地址能预测端口却不能预测。同样的逻辑,如果别人访问自己,自己的地址能预测,自己的端口也能预测,但对方的端口是不能预测的。因为对方是客户端。
2、因此去定义规则时如果定义的是Egress规则(出栈的),那么我们可以定义目标地址和目标端口。如果我们定义的是Ingress规则(入栈的),我们能限制对方的地址,能限制自己的端口,那我们这种限制是针对于哪一个Pod来说的呢?这个网络策略规则是控制哪个pod和别人通信或接受别人通信的呢?我们使用podSelector(pod选择器)去选择pod,意思是这个规则生效在哪个pod上,我们一般使用单个pod进行控制,也可以控制一组pod,所以我们使用podSelector就相当于说我这一组pod都受控于这个Egress和Ingress规则,而且更重要的是我们将来定义规则时还可以指定单方向。意思是入栈我们做控制出栈都允许或出栈做控制入栈都允许。因此定义时可以很灵活的去定义,可以发现他和iptables没有太大的区别。那种方式最安全呢?肯定是拒绝所有放行已知。甚至于如果说你是托管了每一个名称空间托管了不同项目的,甚至不同客户的项目。我们名称空间直接设置默认策略。我们在名称空间内所有pod可以无障碍的通信,但是跨名称空间都不被允许。这种都可以叫一个名称空间的默认策略。
3、接下来我们看这些策略怎么工作起来
a、我们可以看到我们加载的canal pod已经启动起来了
[root@k8smaster ~]# kubectl get pods -n kube-system |grep canal
canal -hmc47 3 /3 Running 0 45m
canal -sw5q6 3 /3 Running 0 45m
canal -xxvzk 3 /3 Running 0 45m
b、我们看我们网络策略怎么定义
[root@k8smaster ~]# kubectl explain networkpolicy
KIND: NetworkPolicy
VERSION: extensions /v1beta1
DESCRIPTION:
DEPRECATED 1.9 - This group version of NetworkPolicy is deprecated by
networking /v1/NetworkPolicy. NetworkPolicy describes what network traffic
is allowed for a set of Pods
FIELDS:
apiVersion <string >
APIVersion defines the versioned schema of this representation of an
object . Servers should convert recognized schemas to the latest internal
value, and may reject unrecognized values. More info :
https: // git.k8s.io/community/contributors/devel/api-conventions.md#resources
kind <string >
Kind is a string value representing the REST resource this object
represents. Servers may infer this from the endpoint the client submits
requests to. Cannot be updated. In CamelCase. More info :
https: // git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds
metadata
Standard object ' s metadata. More info:
https:// git.k8s.io/community/contributors/devel/api-conventions.md#metadata
spec
Specification of the desired behavior for this NetworkPolicy.
[root@k8smaster ~]# kubectl explain networkpolicy.spec
KIND: NetworkPolicy
VERSION: extensions /v1beta1
RESOURCE: spec
DESCRIPTION:
Specification of the desired behavior for this NetworkPolicy.
DEPRECATED 1.9 - This group version of NetworkPolicySpec is deprecated by
networking /v1/NetworkPolicySpec.
FIELDS:
egress <[]Object> #出栈规则
List of egress rules to be applied to the selected pods. Outgoing traffic
is allowed if there are no NetworkPolicies selecting the pod (and cluster
policy otherwise allows the traffic), OR if the traffic matches at least
one egress rule across all of the NetworkPolicy objects whose podSelector
matches the pod. If this field is empty then this NetworkPolicy limits all
outgoing traffic (and serves solely to ensure that the pods it selects are
isolated by default). This field is beta -level in 1.8
ingress <[]Object> #入栈规则
List of ingress rules to be applied to the selected pods. Traffic is
allowed to a pod if there are no NetworkPolicies selecting the pod OR if
the traffic source is the pod ' s local node, OR if the traffic matches at
least one ingress rule across all of the NetworkPolicy objects whose
podSelector matches the pod. If this field is empty then this NetworkPolicy
does not allow any traffic (and serves solely to ensure that the pods it
selects are isolated by default).
podSelector -required- #规则应用在哪个pod上
Selects the pods to which this NetworkPolicy object applies. The array of
ingress rules is applied to any pods selected by this field. Multiple
network policies can select the same set of pods. In this case , the ingress
rules for each are combined additively. This field is NOT optional and
follows standard label selector semantics. An empty podSelector matches all
pods in this namespace.
policyTypes <[]string > #策略类型,指的是假如我在当前这个策略中即定义了Egress又定义了Ingress,那么谁生效呢?虽然他们并不冲突,但是你可以定义在某个时候某一方向的规则生效。
List of rule types that the NetworkPolicy relates to. Valid options are
Ingress, Egress, or Ingress,Egress. If this field is not specified, it will
default based on the existence of Ingress or Egress rules; policies that
contain an Egress section are assumed to affect Egress, and all policies
(whether or not they contain an Ingress section) are assumed to affect
Ingress. If you want to write an egress-only policy, you must explicitly
specify policyTypes [ " Egress " ]. Likewise, if you want to write a policy
that specifies that no egress is allowed, you must specify a policyTypes
value that include " Egress " (since such a policy would not include an
Egress section and would otherwise default to just [ " Ingress " ]). This
field is beta -level in 1.8
我们来看egress定义
[root@k8smaster ~]# kubectl explain networkpolicy.spec.egress
KIND: NetworkPolicy
VERSION: extensions /v1beta1
RESOURCE: egress <[]Object>
DESCRIPTION:
List of egress rules to be applied to the selected pods. Outgoing traffic
is allowed if there are no NetworkPolicies selecting the pod (and cluster
policy otherwise allows the traffic), OR if the traffic matches at least
one egress rule across all of the NetworkPolicy objects whose podSelector
matches the pod. If this field is empty then this NetworkPolicy limits all
outgoing traffic (and serves solely to ensure that the pods it selects are
isolated by default). This field is beta -level in 1.8
DEPRECATED 1.9 - This group version of NetworkPolicyEgressRule is
deprecated by networking /v1/NetworkPolicyEgressRule.
NetworkPolicyEgressRule describes a particular set of traffic that is
allowed out of pods matched by a NetworkPolicySpec ' s podSelector. The
traffic must match both ports and to. This type is beta-level in 1.8
FIELDS:
ports <[]Object> #目标端口,可以是端口名和相关的协议
List of destination ports for outgoing traffic. Each item in this list is
combined using a logical OR. If this field is empty or missing, this rule
matches all ports (traffic not restricted by port). If this field is
present and contains at least one item, then this rule allows traffic only
if the traffic matches at least one port in the list.
to <[]Object>
List of destinations for outgoing traffic of pods selected for this rule.
Items in this list are combined using a logical OR operation. If this field
is empty or missing, this rule matches all destinations (traffic not
restricted by destination). If this field is present and contains at least
one item, this rule allows traffic only if the traffic matches at least one
item in the to list.
我们看看这个to,to表示目标地址,可以是三种情况中的一个,也可以是合并起来的,如果同时使用的话是要取交集。
[root@k8smaster ~]# kubectl explain networkpolicy.spec.egress.to
KIND: NetworkPolicy
VERSION: extensions /v1beta1
RESOURCE: to <[]Object>
DESCRIPTION:
List of destinations for outgoing traffic of pods selected for this rule.
Items in this list are combined using a logical OR operation. If this field
is empty or missing, this rule matches all destinations (traffic not
restricted by destination). If this field is present and contains at least
one item, this rule allows traffic only if the traffic matches at least one
item in the to list.
DEPRECATED 1.9 - This group version of NetworkPolicyPeer is deprecated by
networking /v1/NetworkPolicyPeer.
FIELDS:
ipBlock #目标地址也可以是一个IP地址块,是一个IP地址范围内的所有端点。不管它是pod或主机都行。
IPBlock defines policy on a particular IPBlock. If this field is set then
neither of the other fields can be.
namespaceSelector #意思是名称空间选择器,意思是我们控制的pod能到达其它名称空间的,那个名称空间内的所有pod都在这个范围内。我使用这个选择器选择一组名称空间是指用于控制这组源pod是怎么去访问这组名称空间之内的所有pod或者某一个pod。
Selects Namespaces using cluster -scoped labels. This field follows standard
label selector semantics; if present but empty, it selects all namespaces.
If PodSelector is also set, then the NetworkPolicyPeer as a whole selects
the Pods matching PodSelector in the Namespaces selected by
NamespaceSelector. Otherwise it selects all Pods in the Namespaces selected
by NamespaceSelector.
podSelector #目标地址也可以是另外一组pod,控制两组pod之间通信。源是一组pod,目标地址也是一组pod。
This is a label selector which selects Pods. This field follows standard
label selector semantics; if present but empty, it selects all pods. If
NamespaceSelector is also set, then the NetworkPolicyPeer as a whole
selects the Pods matching PodSelector in the Namespaces selected by
NamespaceSelector. Otherwise it selects the Pods matching PodSelector in
the policy ' s own Namespace.
Ingress只是由to变成了from
c、policyTypes下有几个规则需要我们注意,如果这个字段没有定义,那么只要存在的Egress和Ingress都会生效。但凡出现的定义的都会生效。若我们只定义了Ingress规则,但是在policyTypes中定义了Egress和Ingress,那么Egress的默认规则会生效。如果默认是允许的那么所有规则都被允许,如果默认是拒绝的那么所有规则都被拒绝。我们默认的规则是拒绝的。这里Egress将会使用默认规则拒绝所有。
4、我们去设置一个Ingress默认策略。我们把一个名称空间上所有的入栈规则都关了,都拒绝,谁都不允许入栈。然后我们只放行特定的,这样更安全。比如我们dev名称空间默认所有pod都是被别人能访问的,我们不允许别人访问应该是一个默认规则,那么我们怎么去定义这个规则呢?
a、首先我们创建名称空间dev,pro
[root@k8smaster networkpolicy]# kubectl create namespace dev
namespace /dev created
[root@k8smaster networkpolicy]# kubectl create namespace prod
namespace /prod created
b、接下来我们创建Ingress默认规则并运用于dev名称空间中
[root@k8smaster networkpolicy]# cat ingress-def.yml
apiVersion: networking.k8s.io /v1
kind: NetworkPolicy
metadata:
name: deny -all-ingress
spec:
podSelector: {} #空表示选择所有pod,表示指定名称空间中的所有pod,就相当于控制整个名称空间了
policyTypes:
- Ingress #表示只对Ingress生效,因为没有定义Ingress因此没有任何规则是生效的。没有任何显示定义的规则就意味着默认是拒绝所有的。但是我们没有加Egress意味着,因为policyTypes没有将其定义进来因
此默认是允许的。[root@k8smaster networkpolicy]# kubectl apply -f ingress-def.yml -n dev
networkpolicy.networking.k8s.io /deny-all-ingress created
[root@k8smaster networkpolicy]#
查看我们定义的NetworkPolicy
[root@k8smaster networkpolicy]# kubectl get netpol -n dev
NAME POD -SELECTOR AGE
deny -all-ingress 1m
c、接下来我们dev名称空间创建一个pod看能否被访问到
[root@k8smaster networkpolicy]# cat pod-a.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: myapp
image: ikubernetes /myapp:v1
[root@k8smaster networkpolicy]# kubectl apply -f pod-a.yaml -n dev
pod /pod1 created
[root@k8smaster networkpolicy]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
pod1 1 /1 Running 0 7s
[root@k8smaster networkpolicy]# kubectl get pods -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE
pod1 1 /1 Running 0 1m 10.244 .2.2 k8snode2
[root@k8smaster networkpolicy]# curl 10.244 .2.2 #可以看到无法访问
^C
d、我们在prod名称空间中创建一个pod看能否被访问
[root@k8smaster networkpolicy]# kubectl apply -f pod-a.yaml -n prod
pod /pod1 created
[root@k8smaster networkpolicy]# kubectl get pods -n prod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
pod1 1 /1 Running 0 12s 10.244 .1.2 k8snode1
[root@k8smaster networkpolicy]# curl 10.244 .1.2 #可以看到因为没有定义规则所以能够访问
Hello MyApp | Version: v1 | "hostname.html " >Pod Name
5、现在我们放行2.2,dev名称空间中默认是拒绝一切入栈请求的,现在我们要放行别人对于dev中我们单个pod pod1
[root@k8smaster networkpolicy]# cat ingress-def.yml
apiVersion: networking.k8s.io /v1
kind: NetworkPolicy
metadata:
name: deny -all-ingress
spec:
podSelector: {} #空表示选择所有pod,表示指定名称空间中的所有pod,就相当于控制整个名称空间了
ingress:
- {} #这个所有就表示所有的都允许
policyTypes:
- Ingress #表示只对Ingress生效,此时我们ingress是允许的,Egress也是允许的
[root@k8smaster networkpolicy]# kubectl get pods -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE
pod1 1 /1 Running 0 15m 10.244 .2.2 k8snode2
[root@k8smaster networkpolicy]# curl 10.244 .2.2 #可以看到可以访问了
Hello MyApp | Version: v1 | "hostname.html " >Pod Name
6、接下来加一组规则说我们期望允许别人去访问我们这个2.2这个pod,或者允许一组pod,我们要定义一组pod我们可以这么来定义,比如这组pod给其打一个标签为myapp
a、首先我们给dev中的pod1打上标签myapp,再此之前我们还是先设置为拒绝所有
[root@k8smaster networkpolicy]# cat ingress-def.yml.bak
apiVersion: networking.k8s.io /v1
kind: NetworkPolicy
metadata:
name: deny -all-ingress
spec:
podSelector: {} #空表示选择所有pod,表示指定名称空间中的所有pod,就相当于控制整个名称空间了
policyTypes:
- Ingress #表示只对Ingress生效,因为没有定义Ingress因此没有任何规则是生效的。没有任何显示定义的规则就意味着默认是拒绝所有的。但是我们没有加Egress意味着,因为policyTypes没有将其定义进来因
此默认是允许的。[root@k8smaster networkpolicy]# kubectl apply -f ingress-def.yml.bak -n dev
networkpolicy.networking.k8s.io /deny-all-ingress unchanged
[root@k8smaster networkpolicy]# kubectl label pods pod1 app=myapp -n dev
pod /pod1 labeled
[root@k8smaster networkpolicy]# kubectl get pods -n dev -o wide --show-labels
NAME READY STATUS RESTARTS AGE IP NODE LABELS
pod1 1 /1 Running 0 22m 10.244 .2.2 k8snode2 app=myapp
b、我们设置这样一条Ingress规则:我们放行特定的入栈流量。即我们允许来自于10.244.0.0/16网段的客户端访问我们本地拥有app标签且值为myapp的一组本地pod,对这组pod的访问只要访问到80端口都是允许的,其它端口都没有说明。默认是拒绝的
[root@k8smaster networkpolicy]# cat allow-netpol-demo.yaml
apiVersion: networking.k8s.io /v1
kind: NetworkPolicy
metadata:
name: allow -myapp-ingress
spec:
podSelector:
matchLabels:
app: myapp #匹配标签为myapp的pod
ingress:
- from:
- ipBlock: #网段
cidr: 10.244 .0.0 /16 #放行这个网络
except: #排除这个网络
- 10.244 .1.2 /32 #即排除10.244.1 .2这个地址
ports: #允许访问本机的哪个端口,我们myapp只开放了一个80端口因此我们开放80端口的访问
- protocol: TCP
port: 80
[root@k8smaster networkpolicy]# kubectl apply -f allow-netpol-demo.yaml -n dev
networkpolicy.networking.k8s.io /allow-myapp-ingress unchanged
[root@k8smaster networkpolicy]# kubectl get netpol -n dev
NAME POD -SELECTOR AGE
allow -myapp-ingress app=myapp 34s
deny -all-ingress 49m
[root@k8smaster networkpolicy]# curl 10.244 .2.2
Hello MyApp | Version: v1 | "hostname.html " >Pod Name
我们访问443端口发现也被拒绝,当我们放行后发现能收到访问失败的信息
[root@k8smaster networkpolicy]# curl 10.244 .2.2 :443 #可以看到被拒绝
^C
[root@k8smaster networkpolicy]# cat allow-netpol-demo.yaml
apiVersion: networking.k8s.io /v1
kind: NetworkPolicy
metadata:
name: allow -myapp-ingress
spec:
podSelector:
matchLabels:
app: myapp #匹配标签为myapp的pod
ingress:
- from:
- ipBlock: #网段
cidr: 10.244 .0.0 /16 #放行这个网络
except: #排除这个网络
- 10.244 .1.2 /32 #即排除10.244.1 .2这个地址
ports: #允许访问本机的哪个端口,我们myapp只开放了一个80端口因此我们开放80端口的访问
- protocol: TCP
port: 80
- protocol: TCP
port: 443
[root@k8smaster networkpolicy]# kubectl apply -f allow-netpol-demo.yaml -n dev
networkpolicy.networking.k8s.io /allow-myapp-ingress configured
[root@k8smaster networkpolicy]# curl 10.244 .2.2 :443 #可以看到被放行了
curl: ( 7 ) Failed connect to 10.244 .2.2 :443 ; Connection refused
c、我们要管控出栈流量的方式和管控入栈流量的方式是一样的,只不过将其Ingress改为Egress。
7、以prod名称空间为例,我们将其出栈规则先设置为拒绝,然后我们再慢慢放行,能访问出去,我们让进来都允许
a、首先我们定义netpol
[root@k8smaster networkpolicy]# cat egress-def.yml
apiVersion: networking.k8s.io /v1
kind: NetworkPolicy
metadata:
name: deny -all-egress
spec:
podSelector: {} #空表示选择所有pod,表示指定名称空间中的所有pod,就相当于控制整个名称空间了
policyTypes:
- Egress #表示只对Egress生效,此时我们egress默认拒绝所有,ingress是允许的
[root@k8smaster networkpolicy]# kubectl apply -f egress-def.yml -n prod
networkpolicy.networking.k8s.io /deny-all-egress created
[root@k8smaster networkpolicy]# kubectl get netpol -n prod
NAME POD -SELECTOR AGE
deny -all-egress 16s
b、此时我们看到我们prod 中的pod1是ping不出去的,因为egress默认拒绝了所有流量,要放行所有egress流量也很简单,和ingress处定义方式一样
[root@k8smaster networkpolicy]# cat egress-def.yml
apiVersion: networking.k8s.io /v1
kind: NetworkPolicy
metadata:
name: deny -all-egress
spec:
podSelector: {} #空表示选择所有pod,表示指定名称空间中的所有pod,就相当于控制整个名称空间了
egress:
- {}
policyTypes:
- Egress #表示只对Egress生效,此时我们egress默认拒绝所有,ingress是允许的
[root@k8smaster networkpolicy]# kubectl apply -f egress-def.yml -n prod
networkpolicy.networking.k8s.io /deny-all-egress unchanged
[root@k8smaster networkpolicy]# kubectl exec -it pod1 -n prod /bin/sh
/ # ping 10.244 .0.26
PING 10.244 .0.26 (10.244 .0.26 ): 56 data bytes
64 bytes from 10.244 .0.26 : seq =0 ttl=62 time =3.317 ms
64 bytes from 10.244 .0.26 : seq =1 ttl=62 time =0.630 ms
此时我们还是将egress改回拒绝状态,发现无法ping通
[root@k8smaster networkpolicy]# kubectl exec -it pod1 -n prod /bin/sh
PING 10.244 .0.26 (10.244 .0.26 ): 56 data bytes
^C
egress我们要定义他们特定的放行出站流量的时候我们只能定义对方的端口和对方的地址,事实上自己作为客户端的话是允许访问所有的客户端和所有的远程地址的。应该放行所有,出栈一般没问题,入栈我们控制只有哪些能进来就行,就不再详细说了。如果想做的苛刻一点,对所有名称空间,拒绝所有入栈,拒绝所有出栈,单独放行。但是拒绝所有入栈和出栈就有一个问题,使用podselect写完以后会导致同一个名称空间中pod与pod之间也没法通信了,因为podselect不是在namespace级别控制的而是在pod级别控制的。就表示无论他在不在名称空间彼此之间都不能通信。所以必要的情况下就应该定义先拒绝所有出栈拒绝所有入栈以后再加两条规则,就是本名称空间中的pod出,然后又到本名称空间的pod是允许的。这样就能放行同一个名称空间中的pod通信。
8、一般来说网络策略我们可以这样干
对于名称空间来说,我们先拒绝所有出栈和入栈,然后再放行所有出栈目标为本地所有名称空间内的所有pod;这样至少内部通信没问题了,剩下的跨名称空间再单独定义就行。而放行所有出栈为本名称空间,入栈也是本名称空间,因此此时Ingress和Egress都需要定义。但是我们使用namespaceselector来选择哪个名称空间,或者入栈和出栈的时候都写成podselector,写Ingress和Egress时都写成{},即本地所有的就行了。
转载于:https://www.cnblogs.com/Presley-lpc/p/11351566.html
你可能感兴趣的:(Kubernetes 学习19基于canel的网络策略)
彻底搞懂服务注册与发现:微服务的“通讯录“与“导航系统“
程序猿小白菜
后端java生态圈 微服务 java
一、从外卖订餐说起:为什么需要服务注册与发现?想象你要点一份外卖,这个过程需要:在美团APP找到餐馆餐馆接单后派骑手取餐骑手实时更新位置直到送达用户美团APP餐馆列表骑手定位在微服务架构中,每个服务就像餐馆和骑手:餐馆服务可能部署了10个实例支付服务可能有5个节点订单服务随时可能扩容缩容没有服务注册与发现,就会出现这些问题:新增服务实例需要手动修改配置无法自动剔除故障节点客户端不知道服务实例的实时
如何在 React 中集成第三方库和插件
JJCTO袁龙
react react.js 前端 前端框架
如何在React中集成第三方库和插件在现代前端开发中,React以其声明式、组件化的特性成为开发者的首选框架之一。然而,单一的框架往往无法满足所有需求,集成第三方库和插件变得尤为重要。本文将详细介绍如何在React中高效集成第三方库和插件,并提供一些最佳实践建议。一、选择合适的第三方库或插件在集成第三方库或插件之前,选择合适的工具是关键。以下是一些选择时需要考虑的因素:功能匹配:确保库或插件的功能
认识Linux操作系统
yangyanzlh
任务一查找Linux系统的基本概况任务说明本任务的主要内容是通过网络查找Linux系统最基本的知识,然后对Linux操作系统有一个初步的认识;学会利用网络资源来收集与整理资料,并内化成自己的知识。任务实施第一步:通过搜索引擎搜索Linux在百度以及Google等引擎中搜索UNIX、Linux、Linux操作系统等关键词。阅读与Linux相关的文字材料。第二布:收集整理搜索到的网页(1)UNIX操作
Python基础语法7-模块与包
安迪小宝
python python 开发语言
Python通过模块(module)和包(package)来实现代码的组织和复用,使得开发者可以将功能拆分到不同的文件中,提高代码的可读性和可维护性。本文将介绍如何导入模块、使用内置模块、自定义模块以及管理第三方库。1.导入模块Python提供了多种方式导入模块:1.1import语句最常见的方式是使用import语句导入整个模块:importmathprint(math.sqrt(16))#输出
数据中心运维人员进阶管理指南-突破职业瓶颈,构建多维竞争力
数据中心运维高级工程师
运维 职场和发展 面试 学习方法 程序人生 大数据
引言:运维人的“困局”在数字化浪潮席卷全球的今天,数据中心已然成为企业运营的核心基础设施,而运维人员则是保障数据中心稳定运行的幕后英雄。随着数据中心规模的不断扩大和技术复杂度的提升,运维人员的角色也在悄然发生着转变。从专注于技术难题的攻克,到肩负起团队管理和战略规划的重任,进阶为管理者是许多运维人员职业生涯的重要转折点。本文将探讨数据中心运维人员的进阶路径,助你在职业上更上一层楼。一、目的本文旨在
RuntimeError: CUDA error:device.side assert triggered(tensor形状有误)
Gidear
cuda
报错如下:RuntimeError:CUDAerror:device.sideasserttriggeredCUDAkernelerrorsmightbeasynchronouslyreportedatsomeotherAPIcall,sothestacktracebelowmightbeincorrect.后面经过检查发现,是进行计算的时候维度弄错了,下次遇到这个问题可以试着回去检查数据形状是否
Chrome下载视频的插件
爱编程的喵喵
Windows实用技巧 windows chrome 下载视频
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理解,而且能够帮助新手快速入门。 本文主要介绍了Chrome下载视频的插件,希望能对
利用Temu关键词搜索商品api接口数据说明
鹤眺远方-v
linux 运维 服务器
Temu跨境电商是一个由拼多多公司开发并运营的跨境电商平台,以其独特的理念、丰富的商品种类和便捷的购物体验赢得了消费者的青睐。随着国际业务的不断拓展和市场环境的变化,Temu竞争力不断提升,为全球消费者提供了更多优质、实惠的商品和服务。通常情况下,以下是大致的步骤和一个简单的模拟代码结构(实际的API细节和实现方式需参考Temu平台提供的开发者文档及相关授权接口信息):了解Temu平台的开发者文档
React 各模块相关全面面试及答案解析
刺客-Andy
面试 react.js 面试 前端
一、核心概念1、什么是React?它的核心特性是什么?答案:React是用于构建UI的JavaScript库。核心特性包括组件化、虚拟DOM、单向数据流和声明式编程。2、解释虚拟DOM的工作原理。答案:虚拟DOM是内存中的轻量DOM表示,React通过Diff算法比较新旧虚拟DOM差异,最小化真实DOM操作。3、JSX是什么?为什么使用它?答案:JSX是语法扩展,允许在JS中写类似HTML的结构。
统一封装api接口返回值(一)
异世老者
java后端 java spring restful
前后端分离开发模式中,后端接口基本上都是通过json格式传回前端,通过统一的返回格式封装,可以大大提高开发效率,如:{"code":0,"msg":"成功","data":{"uid":"hjgfyg"}}直接上代码,两个文件即可实现设置一个枚举值,统一封装返回状态码publicenumErrorCode{/*成功状态码*/SUCCESS(0,"成功"),ERROR(1,"操作失败"),/*web
协方差与相关系数概念解释
huangweibo的博客
数学/线性代数 线性代数
参考知乎答案:如何通俗易懂地解释「协方差」与「相关系数」的概念?-GRAYLAMB的回答-知乎https://www.zhihu.com/question/20852004/answer/134902061
AttnGAN: Fine-Grained Text to Image Generation with Attentional Generative Adversarial Networks
EwanRenton
DL paper AttnGAN text2img CVPR 2018 DAMSM
《AttnGAN:Fine-GrainedTexttoImageGenerationwithAttentionalGenerativeAdversarialNetworks》是CVPR2018文本生成图像的文章,是StackGAN++的后续工作。Abstract在本文中作者提出了一个AttentionalGenerativeAd-versarialNetwork(AttnGAN),一种attent
AI大模型与区块链技术的结合
小赖同学啊
人工智能 人工智能 区块链 深度学习
AI大模型与区块链技术的结合,为解决大模型多重组合带来的伦理安全问题提供了创新的解决方案。区块链技术的去中心化、透明性和不可篡改性,可以有效应对AI大模型在数据隐私、模型可信度、责任追溯等方面的挑战。以下是具体的结合方式和应用场景:一、AI大模型与区块链结合的核心价值数据隐私保护:区块链可以确保数据的安全存储和传输,防止数据泄露和滥用。模型可信度:区块链记录模型的训练和使用过程,确保模型的透明性和
浏览器修改后端返回值
rechel000
Chrome修改后端返回值
模拟接口响应和网页内容通过本地覆盖可以模拟接口返回值和响应头,无需mock数据工具,比如(Requestly),无需等待后端支持,快速复现在一些数据下的BUG等。在DevTools可以直接修改你想要的Fetch/XHR接口数据,还可以修改响应头,解决跨域等问题,不仅可以覆盖Fetch/XHR,JS、CSS等资源也可以。本地覆盖其实在之前的版本就已经有了,需要在本地手动创建目录,步骤麻烦。Chrom
【Linux】【编译】automake 调试方法小结
花神庙码农
automake autoconf debug 调试 静默 remake print
作者简介:花神庙码农(专注于Linux、WLAN、TCP/IP、Python等技术方向)博客主页:花神庙码农,地址:https://blog.csdn.net/qxhgd系列专栏:Linux技术如觉得博主文章写的不错或对你有所帮助的话,还望大家三连支持一下呀!!!关注✨、点赞、收藏、评论。如需转载请参考转载须知!!automake调试方法小结非静默输出非静默Automakemake-nSHELLp
vue项目开发,涉及到的js代码
雪碧聊技术
毕业设计 javascript vue.js 前端
本篇文章,主要用来收集vue项目开发的过程中,涉及到的js代码。1、删除数组中,除了首个元素以外的其他所有元素。letarr=[1,2,3,4,5];arr.splice(1);//从索引1开始删除所有元素console.log(arr);//输出:[1]
mybatis后端有返回值前端拿不到
湙泽
mybatis 前端 java
前端情况后端情况一开始没注意才发现是自己少了一个注解解决方法:1.@RestController在Spring中@RestController的作用等同于@Controller+@ResponseBody。2.@ResponseBody@ResponseBody的作用其实是将java对象转为json格式的数据。
Java 中 VO、POJO、DTO 的区别详解
♢.*
java 开发语言
亲爱的小伙伴们,在求知的漫漫旅途中,若你对深度学习的奥秘、Java与Python的奇妙世界,亦或是读研论文的撰写攻略有所探寻,那不妨给我一个小小的关注吧。我会精心筹备,在未来的日子里不定期地为大家呈上这些领域的知识宝藏与实用经验分享。每一个点赞,都如同春日里的一缕阳光,给予我满满的动力与温暖,让我们在学习成长的道路上相伴而行,共同进步✨。期待你的关注与点赞哟!在Java开发的广阔领域中,准确理解和
前端调用后端接口返回数据不显示
qq_45231791
vue
前端调用后端接口返回数据不显示返回的数据是对象,要改为数组[res.data.data]。如果后端返回数据为List数组则不用添加中括号。
Python使用requests库下载文件
飞起来fly呀
Python python 开发语言
在编写Python程序时,requests库是一个强大且流行的HTTP请求工具,用于与网络资源进行交互。特别是在下载文件的操作中,充分利用requests库的功能能显著简化工作。下面我们将深入探讨如何使用requests库下载文件。下载文件的基础示例假设我们需要从互联网上下载一个PDF文件。以下是一个简单且实用的代码示例,其中我们将使用Python的requests库:importrequests
SpringBoot后端常用的返回值封装类
KP3820
后端 后端 spring boot java
SpringBoot后端常用的返回值封装类result类ResultCode类result类publicclassResult{privateintcode;//约定好的,业务状态响应码。privateStringmsg;//业务状态提示信息。privateTdata;//接口处理完成后,返回的数据结果。publicResult(ResultCodecode,Tdata){this.code=co
逻辑回归揭秘:让数据说话,轻松预测未来
星际编程喵
Python探索之旅 逻辑回归 算法 机器学习 python 人工智能
前言听到“逻辑回归”这个名字,大家是不是会觉得它和线性回归有点“亲戚”关系?别被名字骗了!虽然它有“回归”两个字,但它其实是个分类算法,而不是回归问题的解决方案。逻辑回归擅长的可不仅仅是“线性”问题,而是判断“是与否”、“成功与失败”这样的二分类问题。就像你老板问你:“这个月KPI达标了吗?”你能回答“是”或者“不是”,就是这么直接和清晰,毫不含糊。那它是怎么做到如此精准分类的?核心究竟是什么?逻
Python使用requests库下载文件详解
凡客丶
python python 开发语言
Python使用requests库下载文件详解一、引言二、使用requests库下载文件的基本流程三、请求设置和响应处理四、异常处理一、引言在Python编程中,requests库是用于发送HTTP请求和处理HTTP响应的常用库。使用requests库,我们可以轻松地发送GET、POST等请求,并获取响应内容。在下载文件的过程中,requests库提供了一种简便的方法来获取远程服务器上的文件,并将
BERT 模型 和 Milvus 向量数据库分步骤讲解如何实现「文本相似度搜索」
结合BERT模型和Milvus向量数据库,通过一个Python示例分步骤讲解如何实现「文本相似度搜索」。整个过程分为:文本向量化→存储到Milvus→相似度搜索。1️⃣环境准备安装必要的库:pipinstallpymilvustransformerstorch2️⃣流程图解BERT模型↓将文本转为向量Milvus数据库(存储所有向量)↓输入问题文本Milvus搜索相似向量→返回最相似的答案3️⃣完
书籍-《人工智能:原理与实践》
人工智能机器学习深度学习
书籍:ArtificialIntelligence:PrinciplesandPractice作者:GeorgeLuger出版:Springer编辑:陈萍萍的公主@一点人工一点智能下载:书籍下载-《人工智能:原理与实践》01书籍介绍本书全面介绍了人工智能(AI),涵盖了理解AI所需的基础计算技术、数学原理、哲学思考以及工程学科。《人工智能:原理与实践》强调了AI的跨学科性质,整合了心理学、数学、神
只有IP地址怎么实现H T T P S访问?——附详细申请方法
ssl证书httpsip
IP地址SSL证书是一种专为公网IP地址颁发的数字证书,由受信任的证书颁发机构签发。它基于公钥基础设施(PKI)技术,提供了身份验证和数据加密两大核心功能。这种证书直接绑定到服务器的公网IP地址上,而不是传统的域名,用于确保通过该IP地址进行的通信是加密且可信的。当IP地址与SSL技术相结合时,可以保护只有公网IP地址的网站的数据传输安全,防止信息泄露或被篡改。IP地址证书:打开JoySSL官网注
期权帮|沪深300股指期货合约技巧有哪些?
qiquandongkh
区块链 大数据 金融
锦鲤三三每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯!沪深300股指期货合约技巧有哪些?沪深300指数,代表了中国A股市场整体表现。沪深300指数的交割制度,采用现金交割方式,交割日为每月第三个周五。沪深300指数的交易时间是上午9:30至11:30,下午13:00至15:00,无夜盘交易。一、沪深300指数的技术分析:(1)移动平均线:用于判断市场趋势,短期均线(如5日均线)上穿
期权帮|看跌期权和看涨期权的收益计算有什么区别?
qiquandongkh
区块链 金融 大数据
锦鲤三三每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯!看跌期权和看涨期权的收益计算有什么区别?一、看涨期权的收益计算(1)收益计算公式看涨期权的收益计算公式为:收益=(标的资产价格−执行价格)−期权费其中:标的资产价格:期权到期时标的资产的市场价格。执行价格:期权合约中规定的购买资产的价格。期权费:购买期权所支付的费用。(2)收益实现条件当标的资产价格高于执行价格时:期权买方会选择
大模型驱动智能合规 | 构建企业个保审计新范式
安全
《个人信息保护合规审计管理办法》即将于2025年5月1日正式施行,在该办法的答记者问中提及:“个人信息处理者开展个人信息保护合规审计分两种情形:一是自行开展合规审计,即个人信息处理者应当定期对其处理个人信息遵守法律、行政法规的情况进行合规审计。处理超过1000万人个人信息的个人信息处理者,应当每两年至少开展一次个人信息保护合规审计。其他个人信息处理者根据自身情况合理确定定期开展个人信息保护合规审计
期权帮 | 聊一聊股指期货交割是什么意思?
qiquandongkh
区块链 大数据
锦鲤三三每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯!聊一聊股指期货交割是什么意思?股指期货交割,就是股指期货合约到期时,咱们得按照合约的规定来结束这笔交易。大多数时候,我们都是用现金交割这种方式。也就是说,到期时,咱们会根据一个叫做“指数最终结算价”的东西,和你买的或卖的合约价格比一比,算出赚了多少钱或者亏了多少钱。不用真的交股票或者给钱,直接算出一个差价,通过银行转账的方式,把
算法 单链的创建与删除
换个号韩国红果果
c 算法
先创建结构体
struct student {
int data;
//int tag;//标记这是第几个
struct student *next;
};
// addone 用于将一个数插入已从小到大排好序的链中
struct student *addone(struct student *h,int x){
if(h==NULL) //??????
《大型网站系统与Java中间件实践》第2章读后感
白糖_
java中间件
断断续续花了两天时间试读了《大型网站系统与Java中间件实践》的第2章,这章总述了从一个小型单机构建的网站发展到大型网站的演化过程---整个过程会遇到很多困难,但每一个屏障都会有解决方案,最终就是依靠这些个解决方案汇聚到一起组成了一个健壮稳定高效的大型系统。
看完整章内容,
zeus持久层spring事务单元测试
deng520159
java DAO spring jdbc
今天把zeus事务单元测试放出来,让大家指出他的毛病,
1.ZeusTransactionTest.java 单元测试
package com.dengliang.zeus.webdemo.test;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import
Rss 订阅 开发
周凡杨
html xml 订阅 rss 规范
RSS是 Really Simple Syndication的缩写(对rss2.0而言,是这三个词的缩写,对rss1.0而言则是RDF Site Summary的缩写,1.0与2.0走的是两个体系)。
RSS
分页查询实现
g21121
分页查询
在查询列表时我们常常会用到分页,分页的好处就是减少数据交换,每次查询一定数量减少数据库压力等等。
按实现形式分前台分页和服务器分页:
前台分页就是一次查询出所有记录,在页面中用js进行虚拟分页,这种形式在数据量较小时优势比较明显,一次加载就不必再访问服务器了,但当数据量较大时会对页面造成压力,传输速度也会大幅下降。
服务器分页就是每次请求相同数量记录,按一定规则排序,每次取一定序号直接的数据
spring jms异步消息处理
510888780
jms
spring JMS对于异步消息处理基本上只需配置下就能进行高效的处理。其核心就是消息侦听器容器,常用的类就是DefaultMessageListenerContainer。该容器可配置侦听器的并发数量,以及配合MessageListenerAdapter使用消息驱动POJO进行消息处理。且消息驱动POJO是放入TaskExecutor中进行处理,进一步提高性能,减少侦听器的阻塞。具体配置如下:
highCharts柱状图
布衣凌宇
hightCharts 柱图
第一步:导入 exporting.js,grid.js,highcharts.js;第二步:写controller
@Controller@RequestMapping(value="${adminPath}/statistick")public class StatistickController { private UserServi
我的spring学习笔记2-IoC(反向控制 依赖注入)
aijuans
spring mvc Spring 教程 spring3 教程 Spring 入门
IoC(反向控制 依赖注入)这是Spring提出来了,这也是Spring一大特色。这里我不用多说,我们看Spring教程就可以了解。当然我们不用Spring也可以用IoC,下面我将介绍不用Spring的IoC。
IoC不是框架,她是java的技术,如今大多数轻量级的容器都会用到IoC技术。这里我就用一个例子来说明:
如:程序中有 Mysql.calss 、Oracle.class 、SqlSe
TLS java简单实现
antlove
java ssl keystore tls secure
1. SSLServer.java
package ssl;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.security.KeyStore;
import
Zip解压压缩文件
百合不是茶
Zip格式解压 Zip流的使用 文件解压
ZIP文件的解压缩实质上就是从输入流中读取数据。Java.util.zip包提供了类ZipInputStream来读取ZIP文件,下面的代码段创建了一个输入流来读取ZIP格式的文件;
ZipInputStream in = new ZipInputStream(new FileInputStream(zipFileName));
&n
underscore.js 学习(一)
bijian1013
JavaScript underscore
工作中需要用到underscore.js,发现这是一个包括了很多基本功能函数的js库,里面有很多实用的函数。而且它没有扩展 javascript的原生对象。主要涉及对Collection、Object、Array、Function的操作。 学
java jvm常用命令工具——jstatd命令(Java Statistics Monitoring Daemon)
bijian1013
java jvm jstatd
1.介绍
jstatd是一个基于RMI(Remove Method Invocation)的服务程序,它用于监控基于HotSpot的JVM中资源的创建及销毁,并且提供了一个远程接口允许远程的监控工具连接到本地的JVM执行命令。
jstatd是基于RMI的,所以在运行jstatd的服务
【Spring框架三】Spring常用注解之Transactional
bit1129
transactional
Spring可以通过注解@Transactional来为业务逻辑层的方法(调用DAO完成持久化动作)添加事务能力,如下是@Transactional注解的定义:
/*
* Copyright 2002-2010 the original author or authors.
*
* Licensed under the Apache License, Version
我(程序员)的前进方向
bitray
程序员
作为一个普通的程序员,我一直游走在java语言中,java也确实让我有了很多的体会.不过随着学习的深入,java语言的新技术产生的越来越多,从最初期的javase,我逐渐开始转变到ssh,ssi,这种主流的码农,.过了几天为了解决新问题,webservice的大旗也被我祭出来了,又过了些日子jms架构的activemq也开始必须学习了.再后来开始了一系列技术学习,osgi,restful.....
nginx lua开发经验总结
ronin47
使用nginx lua已经两三个月了,项目接开发完毕了,这几天准备上线并且跟高德地图对接。回顾下来lua在项目中占得必中还是比较大的,跟PHP的占比差不多持平了,因此在开发中遇到一些问题备忘一下 1:content_by_lua中代码容量有限制,一般不要写太多代码,正常编写代码一般在100行左右(具体容量没有细心测哈哈,在4kb左右),如果超出了则重启nginx的时候会报 too long pa
java-66-用递归颠倒一个栈。例如输入栈{1,2,3,4,5},1在栈顶。颠倒之后的栈为{5,4,3,2,1},5处在栈顶
bylijinnan
java
import java.util.Stack;
public class ReverseStackRecursive {
/**
* Q 66.颠倒栈。
* 题目:用递归颠倒一个栈。例如输入栈{1,2,3,4,5},1在栈顶。
* 颠倒之后的栈为{5,4,3,2,1},5处在栈顶。
*1. Pop the top element
*2. Revers
正确理解Linux内存占用过高的问题
cfyme
linux
Linux开机后,使用top命令查看,4G物理内存发现已使用的多大3.2G,占用率高达80%以上:
Mem: 3889836k total, 3341868k used, 547968k free, 286044k buffers
Swap: 6127608k total,&nb
[JWFD开源工作流]当前流程引擎设计的一个急需解决的问题
comsci
工作流
当我们的流程引擎进入IRC阶段的时候,当循环反馈模型出现之后,每次循环都会导致一大堆节点内存数据残留在系统内存中,循环的次数越多,这些残留数据将导致系统内存溢出,并使得引擎崩溃。。。。。。
而解决办法就是利用汇编语言或者其它系统编程语言,在引擎运行时,把这些残留数据清除掉。
自定义类的equals函数
dai_lm
equals
仅作笔记使用
public class VectorQueue {
private final Vector<VectorItem> queue;
private class VectorItem {
private final Object item;
private final int quantity;
public VectorI
Linux下安装R语言
datageek
R语言 linux
命令如下:sudo gedit /etc/apt/sources.list1、deb http://mirrors.ustc.edu.cn/CRAN/bin/linux/ubuntu/ precise/ 2、deb http://dk.archive.ubuntu.com/ubuntu hardy universesudo apt-key adv --keyserver ke
如何修改mysql 并发数(连接数)最大值
dcj3sjt126com
mysql
MySQL的连接数最大值跟MySQL没关系,主要看系统和业务逻辑了
方法一:进入MYSQL安装目录 打开MYSQL配置文件 my.ini 或 my.cnf查找 max_connections=100 修改为 max_connections=1000 服务里重起MYSQL即可
方法二:MySQL的最大连接数默认是100客户端登录:mysql -uusername -ppass
单一功能原则
dcj3sjt126com
面向对象的程序设计 软件设计 编程原则
单一功能原则[
编辑]
SOLID 原则
单一功能原则
开闭原则
Liskov代换原则
接口隔离原则
依赖反转原则
查
论
编
在面向对象编程领域中,单一功能原则(Single responsibility principle)规定每个类都应该有
POJO、VO和JavaBean区别和联系
fanmingxing
VO POJO javabean
POJO和JavaBean是我们常见的两个关键字,一般容易混淆,POJO全称是Plain Ordinary Java Object / Plain Old Java Object,中文可以翻译成:普通Java类,具有一部分getter/setter方法的那种类就可以称作POJO,但是JavaBean则比POJO复杂很多,JavaBean是一种组件技术,就好像你做了一个扳子,而这个扳子会在很多地方被
SpringSecurity3.X--LDAP:AD配置
hanqunfeng
SpringSecurity
前面介绍过基于本地数据库验证的方式,参考http://hanqunfeng.iteye.com/blog/1155226,这里说一下如何修改为使用AD进行身份验证【只对用户名和密码进行验证,权限依旧存储在本地数据库中】。
将配置文件中的如下部分删除:
<!-- 认证管理器,使用自定义的UserDetailsService,并对密码采用md5加密-->
mac mysql 修改密码
IXHONG
mysql
$ sudo /usr/local/mysql/bin/mysqld_safe –user=root & //启动MySQL(也可以通过偏好设置面板来启动)$ sudo /usr/local/mysql/bin/mysqladmin -uroot password yourpassword //设置MySQL密码(注意,这是第一次MySQL密码为空的时候的设置命令,如果是修改密码,还需在-
设计模式--抽象工厂模式
kerryg
设计模式
抽象工厂模式:
工厂模式有一个问题就是,类的创建依赖于工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则。我们采用抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。
总结:这个模式的好处就是,如果想增加一个功能,就需要做一个实现类,
评"高中女生军训期跳楼”
nannan408
首先,先抛出我的观点,各位看官少点砖头。那就是,中国的差异化教育必须做起来。
孔圣人有云:有教无类。不同类型的人,都应该有对应的教育方法。目前中国的一体化教育,不知道已经扼杀了多少创造性人才。我们出不了爱迪生,出不了爱因斯坦,很大原因,是我们的培养思路错了,我们是第一要“顺从”。如果不顺从,我们的学校,就会用各种方法,罚站,罚写作业,各种罚。军
scala如何读取和写入文件内容?
qindongliang1922
java jvm scala
直接看如下代码:
package file
import java.io.RandomAccessFile
import java.nio.charset.Charset
import scala.io.Source
import scala.reflect.io.{File, Path}
/**
* Created by qindongliang on 2015/
C语言算法之百元买百鸡
qiufeihu
c 算法
中国古代数学家张丘建在他的《算经》中提出了一个著名的“百钱买百鸡问题”,鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁,母,雏各几何?
代码如下:
#include <stdio.h>
int main()
{
int cock,hen,chick; /*定义变量为基本整型*/
for(coc
Hadoop集群安全性:Hadoop中Namenode单点故障的解决方案及详细介绍AvatarNode
wyz2009107220
NameNode
正如大家所知,NameNode在Hadoop系统中存在单点故障问题,这个对于标榜高可用性的Hadoop来说一直是个软肋。本文讨论一下为了解决这个问题而存在的几个solution。
1. Secondary NameNode
原理:Secondary NN会定期的从NN中读取editlog,与自己存储的Image进行合并形成新的metadata image
优点:Hadoop较早的版本都自带,