一、概述
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的网络策略)
GO——垃圾回收机制学习
笨鸟先飞的橘猫
golang 学习
标记-清除go1.5之前使用的策略核心流程标记阶段(Mark):从根对象(全局变量、栈、寄存器中的指针等)出发,递归遍历所有可达对象并标记为存活。清除阶段(Sweep):遍历堆内存,回收未被标记的对象(即不可达的垃圾对象)。STW(Stop-The-World)问题全程暂停:在标记和清除阶段,用户程序需要完全停止(STW),导致显著的延迟。例如,在Go1.0中,即使堆内存很小,STW时间也可能达到
物联网环境下机器人隐私保护法律框架研究-隐私保护法律监管平台
大霸王龙
行业+领域+业务场景=定制 物联网 机器人 python 算法 数据可视化 数据结构
1.引言物联网技术的发展推动了机器人在家庭、医疗、工业等领域的广泛应用。然而,这些智能设备在数据采集和处理过程中面临着巨大的隐私保护挑战。本设计方案旨在构建一个全面的隐私保护法律监管平台,确保物联网环境下机器人的隐私数据得到有效保护,并符合相关法律法规的要求。2.平台目标提供一个集成的监管平台,实时监控和管理物联网机器人产生的隐私数据。确保隐私数据的采集、存储、处理和传输符合相关隐私保护法律法规。
悦读声界·小说语音管理系统
大霸王龙
行业+领域+业务场景=定制 人工智能 小说转语音 python django 管理系统
1.产品介绍产品名称:悦读声界·小说语音管理系统主要功能:智能语音朗读功能描述:用户可通过语音指令或简单点击,启动系统内置的AI语音引擎,自动将小说文本转化为流畅自然的语音朗读,支持多种语言及方言选择,满足不同用户的听觉偏好。使用方式:用户上传或选择平台内的小说资源后,选择朗读模式(如单章节、连续播放、定时关闭等),系统即刻开始朗读,同时支持语速、语调、角色声音等个性化设置。情感化语音演绎功能描述
蓝桥杯2020年第十一届省赛真题-I题-平面切分详细注释
shan1956
蓝桥杯 平面
原题链接2873.平面切分-AcWing题库https://www.acwing.com/problem/content/description/2876/代码#include#include//stl:set容器头文件引用set不能添加已经存在的元素usingnamespacestd;typedefpairpdd;//typedef可以将一种数据类型定义为自己习惯的名称。setline;//pa
Leetcode第77题组合|C语言
[略略略]
Leetcode c语言 算法 leetcode 数据结构
题目:给定两个整数n和k,返回范围[1,n]中所有可能的k个数的组合。你可以按任何顺序返回答案。voiddfs(intcur,intn,intk,int*temp_index,int*returnSize,int**ans,int*temp){//cur是每轮遍历要加入的数字,n和k为题目要求的从1-n里挑k个数字//temp是存放每次遍历挑k个数字时的数组,ans是存放数组的数组//return
《基于大数据的相州镇新农村商务数据分析与研究》开题报告
Python数据分析与机器学习
毕业论文/研究报告 大数据 数据分析 数据挖掘 算法 人工智能 python
目录一、选题依据1.选题背景2.国内外研究现状与水平(1)国外研究现状(2)国内研究现状3.发展趋势4.研究意义二、研究内容1.学术构思与思路(1)主要研究内容(2)拟解决的关键问题或技术2.拟采取的研究方法、技术路线、实施方案及可行性分析(1)研究方法(2)技术路线(3)实施方案(4)可行性分析三、参考文献一、选题依据1.选题背景随着信息技术的快速发展,尤其是互联网技术的普及,农村商务环境正在经
CRUD是如何挤进大厂的?简历-面试题-技术总结 一步步努力,springboot环境搭建教程
1024创新开发
程序员 面试 后端 java
常见的简历会这么写,“负责订单系统开发,实现订单创建、查询、列表等功能,使用技术:Spring、Mybatis……”。如果我是面试官,我的印象是你写过一些CRUD项目,这很难通过大厂的简历关。那该怎么写的呢?比如:“负责订单系统核心模块开发(Task),主导设计订单系统数据库表结构,设计以会员为维度的分库方案,设计并开发订单列表及明细缓存方案(Action),支撑订单每日X万级查询请求(Resul
MySQL外键约束(FOREIGN KEY)案例讲解
liming89
mysql
文章来源:学习通http://www.jaxp.net/MySQL外键约束(FOREIGNKEY)是表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。比如,一个水果摊,只有苹果、桃子、李子、西瓜等4种水果,那么,你
CMS、G1以及ZGC对比--JVM基础(12)
guangzhi0633
jvm
一、JVM回收器大比拼:CMS、G1与ZGC深度剖析在Java的广袤宇宙中,JVM(Java虚拟机)是每位开发者不可或缺的伙伴。而垃圾回收器,作为JVM的“清洁工”,更是决定了我们应用的性能和响应速度。今天,就让我们一起走进这三位JVM回收器——CMS、G1与ZGC的世界,深度剖析它们的实现原理,看看它们是如何为我们的应用保驾护航(一)、CMS:并发的优雅舞者CMS(ConcurrentMark-
Flink SQL 底层封装的原理
goTsHgo
Flink 大数据 分布式 flink sql 大数据
ApacheFlink是一个分布式流处理引擎,而FlinkSQL是其提供的一个SQL层,允许用户通过标准SQL查询对流式或批量数据进行查询和分析。FlinkSQL的实现基于ApacheCalcite,这是一个通用的SQL解析和优化引擎,Flink在其基础上进行了扩展和优化,以支持流数据的查询语义(如窗口、事件时间等)。要理解FlinkSQL的底层实现,首先需要理解Flink是如何通过SQL解析、优
P8682 [蓝桥杯 2019 省 B] 等差数列--sort()
滨HI0
蓝桥杯 职场和发展
P8682[蓝桥杯2019省B]等差数列题目解析代码题目解析没什么做的,已知是乱序的等差数列,哪就先排序利用sort函数,再找出公差就行,然后用最后一项带公式求出N的值介绍一下sort()函数(默认升序,左闭右开)【降序没必要记,反着遍历就行】1)常用于vector数组中:sort(vec.begin(),vec.end());2)在常规数组中:sort(a,a+n)是什么意思?第一个参数a:代表
Lua tunumber函数
auspark
Lua
【0】总述tonumber函数会尝试将它的参数转换为数字。如果参数已经是一个数字或者是一个可以转换成数字的字符串,那么这个函数就会返回转换后的数值,否则,返回nil(表示转换失败)。这个函数有一个额外的参数base可用来指定参数的进制:(1)默认参数值是10(2)参数的取值范围是[2,36](3)当参数值超过10时,使用A代表10(大小写都可以),B代表11,以此类推最后Z代表35【1】应用ton
【转】android安全与逆向进阶路线
Synioe
android android
【转自论坛热帖】此篇整理了最完整的--Android逆向学习线路知识体系。希望给迷糊的入门者指出一个明确的方向。真心建议:先正向开发几年再搞逆向吧……正向都不会破解的是啥?不看代码只会脱壳?只会xposed?远远不够,hook只是很小一部分技术,xposed是hook功能众多框架中的一个而已。相对于任何程序的开发来说,逆向知识点很少很少了,关键是基础知识,基础就是正向开发经验。学习Android逆
W3C标准和ES规范之一文通
向贤
技术面试 es web
W3C标准和ES规范之一文通以下是关于W3C标准和ES规范的透彻解析,通过结构化对比和生活化类比帮助理解和记忆:一、核心概念对比(总览)维度W3C标准ES规范(ECMAScript)定位Web技术的建筑蓝图JavaScript的语言宪法管辖范围HTML/CSS/DOM/WebAPI等网页技术标准JavaScript语言的语法与核心功能规范制定组织W3C(万维网联盟)ECMA国际组织更新节奏分模块迭
C++多态实现——函数重载
PixelLogic
c++ java 开发语言 编程
C++多态实现——函数重载C++中的多态性是指在使用相同的名称调用不同的函数。一种方式实现多态性是通过函数重载。函数重载是指可以有多个同名函数,但其参数类型或数量必须不同。C++编译器可以根据参数的类型和数量来区分不同的同名函数,并自动调用合适的函数,即实现函数重载。下面我们以一个简单的例子为例,演示如何使用函数重载:代码如下:#includeusingnamespacestd;classTest
MySQL数据库练习题
受命于天既寿永昌
MySQL 数据库
例题1创建一个名为school的数据库,并在其中创建一个名为students的数据表。students表应包含以下字段:student_id:整型,作为主键,自动递增。first_name:字符串类型,最大长度为30,不允许为空。last_name:字符串类型,最大长度为50,不允许为空。birthdate:日期类型,用于存储学生的出生日期。gender:字符类型,长度为1,只允许存储'M'(男性
Flink如何做流计算?大数据世界的“实时魔法”
狮歌~资深攻城狮
struts servlet java
Flink如何做流计算?大数据世界的“实时魔法”揭秘✨嘿,各位小伙伴!今天咱们来聊聊Flink是怎么做流计算的。想象一下,你身处一个数据如水流般源源不断的大数据世界,Flink就像是一位神奇的魔法师能够实时处理这些流动的数据,为我们揭示其中的奥秘。那它到底是怎么施展魔法的呢?让我们一起来揭开这个神秘的面纱吧一、流计算是啥玩意儿?在深入了解Flink的流计算之前,咱们得先搞清楚流计算到底是什么。简单
Flink SQL的使用
超人在良家-阿启
Flink 1024程序员节 flink
文章目录一、FlinkSQL简介1.1FlinkSQL特点1.2工作原理1.3应用场景二、FlinkSQL语法2.1CREATEcreate语句2.2SELECTselect语句2.2.1简单查询2.2.2过滤操作2.2.3聚合操作2.2.4窗口操作(针对流数据)2.3INSERT语句2.4输出到控制台(用于调试)三、基础流程3.1、所有Flink的操作都是基于StreamExecutionEnv
flutter实战!2021年Android网络编程总结篇,移动架构师成长路线
椰果学Android
程序员 android
什么是中年危机根据权威数据显示,国内IT程序员鼎盛时期是在25-27岁左右,30岁对于程序员而言完全是一个38线,接着就是转业转岗的事情,这一点在业界也算是一个共识了。大学毕业步入IT行业普遍年龄也是在22岁左右,然而22-30岁之间也就是8年左右的时间,那么27岁也就是职业生涯“中年”的开始,那么作为程序员的你有准备好如何度过“中年危机”吗?当程序猿到了28岁左右的“中年危机”就不一样了,这个年
TypeScript泛型约束的高级应用
t0_54program
typescript javascript 前端 个人开发
在TypeScript中,泛型是一种强大的工具,它允许我们编写更具通用性和可复用性的代码。而泛型约束则是对泛型参数的一种限制,通过使用extends关键字,我们可以确保泛型参数满足特定的条件。本文将通过几个实例,深入探讨TypeScript泛型约束的高级应用。一、基础泛型约束在TypeScript中,我们可以使用extends关键字对泛型类型参数施加约束。例如,我们定义一个Shape接口,要求所有
mac多版本python环境下解决模块导入问题
秋窗7
python 问题总结 macos python 开发语言
问题引入以Flask模块为例,在下载时使用pipinstallFlask,结果解释运行一个导入了flask模块的python文件时,显示ModuleNotFoundError:Nomodulenamed'flask',如下:原因是当前电脑有多个python版本,使用pip安装的包也就不是每个解释器都能用。(提示;关于python版本管理可以看我往期的文章:Mac下Python版本管理,适用于pye
linux基础
须尽欢-
linux
linux查找的命令有哪些在Linux中,用于查找文件的命令主要有以下几个:find:在文件系统中根据条件查找文件。locate:通过数据库查找文件,速度比find快。which:查找执行文件(即命令)的位置。whereis:查找二进制、源码和man手册页等相关文件的路径。grep:在文件中查找包含指定模式的行。计算机的发展电子管时代特点:体积大,功耗高,可靠性差,运算速度慢,价格昂贵典型:ENI
部分背包问题(贪心算法)
萧毅寒
贪心算法 算法
一、概念与问题背景部分背包问题是一种经典的优化问题,其中给定一系列物品,每个物品有一定的重量和价值,目标是在一个固定容量的背包中装入物品,使得背包中物品的总价值最大。与0/1背包问题不同,部分背包问题允许将物品分割,即可以只选择物品的一部分装入背包。二、贪心策略介绍对于部分背包问题,贪心算法是一种有效的解决策略。贪心策略的基本思想是,在每一步选择中,都采取在当前状态下最好或最优(即最有利)的选择,
Skynet入门(一)
笨鸟先飞的橘猫
lua Skynet
概念skynet是一个为网络游戏服务器设计的轻量框架。但它本身并没有任何为网络游戏业务而特别设计的部分,所以尽可以把它用于其它领域。设计初衷如何充分利用它们并行运作数千个相互独立的业务。模块设计建议在skynet中,用服务(service)这个概念来表达某项具体业务,它包括了处理业务的逻辑以及关联的数据状态。使用skynet实现游戏服务器时,不建议把业务状态同步到数据库中,而是存放在服务的内存数据
macos下cocoapods的学习
auspark
macos cocoapods 学习
step1:升级ruby$/bin/bash-c"$(curl-fsSLhttps://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"$brewupdate$brewinstallruby$echo'exportPATH="/usr/local/opt/ruby/bin:$PATH"'>>~/.bash_profile$ex
《基于Django和ElasticSearch的学术论文搜索推荐系统的设计与实现》开题报告
Python数据分析与机器学习
毕业论文/研究报告 elasticsearch 大数据 搜索引擎 课程设计 python django 开发语言
目录一、选题的背景和意义(一)选题背景(二)选题意义2.1.提升科研效率2.2促进学术创新2.3优化资源配置二、选题的国内外现状与总结(一)国内现状(二)国外现状(三)总结三、选题的主要内容和拟解决关键问题(一)主要内容1.数据库设计与实现2.搜索功能实现3.推荐功能实现4.用户管理与交互功能实现(二)拟解决关键问题1.数据质量与整合难题解决措施:2.搜索精准度与性能优化解决措施:四、选题的设计方
P8720 [蓝桥杯 2020 省 B2] 平面切分--set、pair
滨HI0
蓝桥杯 平面 职场和发展
P8720[蓝桥杯2020省B2]平面切分--set、pair题目分析一、pair1.1pair与vector的区别1.2两者使用场景两者组合使用二、set2.1核心特点2.2set的基本操作2.3setvsunordered_set示例:统计唯一单词数代码题目分析大佬写的很明白,看这儿我讲讲其中用到的知识点吧!一、pairpair是C++中的一个模板类,用于存储两个值(可以是不同类型)。1、基本
如何用3个月零基础入门网络安全?_网络安全零基础怎么学习
白帽黑客啊一
学习 web安全 安全 密码学 网络安全
基于入门网络安全/黑客打造的:黑客&网络安全入门&进阶学习资源包前言写这篇教程的初衷是很多朋友都想了解如何入门/转行网络安全,实现自己的“黑客梦”。文章的宗旨是:1.指出一些自学的误区2.提供客观可行的学习表3.推荐我认为适合小白学习的资源.大佬绕道哈!基于入门网络安全/黑客打造的:黑客&网络安全入门&进阶学习资源包一、自学网络安全学习的误区和陷阱1.不要试图先成为一名程序员(以编程为基础的学习)
JQuery是什么
编程芝士
Java基础学习
jQuery是什么概念:一个JavaScript框架。简化JS开发jQuery是一个快速、简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架)。jQuery设计的宗旨是“writeLess,DoMore”,即倡导写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,
Rk3568驱动开发_新字符设备驱动原理_7
Narnat
驱动开发
1.申请设备号:之前用的是register_chrdev(LED_MAJOR,LED_NAME,&led_fops);手动申请很不方便使用alloc_chrdev_region函数申请设备号,手动申请的话要先查询是否有空余的设备号,很不方便,用此函数内核会自动将将空余设备号给你,释放设备号用unregister_chrdev_region如果指定主设备号则用register_chrdev_regi
算法 单链的创建与删除
换个号韩国红果果
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较早的版本都自带,