centos7安装kubernetes-v1.7安装配置calico网络组件

安装条件

  • kube-apiserver 必须开启参数 --runtime-config=extensions/v1beta1/networkpolicies=true

    • v1.6以及以前的版本需要在apiserver开启 extensions/v1beta1/networkpolicies
    • v1.7+版本Network Policy已经GA,API版本为 networking.k8s.io/v1
  • kubelet 配置使用cni网络插件 --network-plugin=cni

  • kube-proxy 必须使用iptables模式 --proxy-mode=iptables,默认就是这个参数
  • kube-proxy 不能设置 --masquerade-all
  • kubernetes > v1.3.0

安装

1. 配置rbac

1
2
3
4
mkdir /server/software/k8s/calico
cd /server/software/k8s/calico
wget http://docs.projectcalico.org/v2.4/getting-started/kubernetes/installation/rbac.yaml
kubectl apply -f rbac.yaml

2. 拉取镜像

1
2
3
4
5
6
7
docker pull calico/node:v2.4.0
docker pull calico/cni:v1.10.0
docker pull calico/kube-policy-controller:v0.7.0

docker tag calico/node:v2.4.0 quay.io/calico/node:v2.4.0
docker tag calico/cni:v1.10.0 quay.io/calico/cni:v1.10.0
docker tag calico/kube-policy-controller:v0.7.0 quay.io/calico/kube-policy-controller:v0.7.0

3. 启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 下载配置文件
wget http://docs.projectcalico.org/v2.4/getting-started/kubernetes/installation/hosted/calico.yaml

# 修改etcd相关的配置
etcd_endpoints: "https://192.168.12.211:2379,https://192.168.12.212:2379,https://192.168.12.213:2379"

# 由于使用了tls需要配置如下位置
etcd_ca: "/calico-secrets/etcd-ca"
etcd_cert: "/calico-secrets/etcd-cert"
etcd_key: "/calico-secrets/etcd-key"
...
etcd-key: xxxxxxxxxx
etcd-cert: xxxxxxxxxxx
etcd-ca: xxxxxxxxxxxx
...

# 上面的内容使用如下方式获取
base64 /etc/kubernetes/ssl/kubernetes-key.pem | tr -d '\n'
base64 /etc/kubernetes/ssl/kubernetes.pem | tr -d '\n'
base64 /etc/kubernetes/ssl/ca.pem | tr -d '\n'


# 如果pod不能正常上网,还可以指定网卡。
# 在配置node的containers段的env配置如下环境变量
- name: IP_AUTODETECTION_METHOD
value: "IP_AUTODETECTION_METHOD=can-reach=www.baidu.com"

# 或者配置如下形式
- name: IP_AUTODETECTION_METHOD
value: "IP_AUTODETECTION_METHOD=interface=eth0"


# 启动
kubectl apply -f calico.yaml


# 查看
kubectl get pods -n kube-system

4. 测试

1
2
3
4
# 启动多个容器查看,看是否能ping通
kubectl run calico-test-1 --rm -ti --image busybox /bin/sh
kubectl run calico-test-2 --rm -ti --image busybox /bin/sh
kubectl run calico-test-3 --rm -ti --image busybox /bin/sh

Network policy 测试

默认网络是全部连通的,POD之间可以随意访问。

1. 创建 nginx deploy

1
2
3
kubectl run nginx --image=nginx --replicas=2
kubectl expose deployment nginx --port=80
kubectl get svc,pod

2. 测试
测试应该通过

1
2
3
# 10.254.132.113 为上面获取到的 nginx 的集群 IP
kubectl run busybox --rm -ti --image=busybox /bin/sh
wget --spider --timeout=1 10.254.132.113

3. 限制连接
限制连接,只有设置了label access: true才能访问到 nginx 服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cat >nginx-policy.yaml<<EOF
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: access-nginx
spec:
podSelector:
matchLabels:
run: nginx
ingress:
- from:
- podSelector:
matchLabels:
access: "true"
EOF

kubectl create -f nginx-policy.yaml

4. 测试
测试应该不能通过

1
2
kubectl run busybox --rm -ti --image=busybox /bin/sh
wget --spider --timeout=1 10.254.132.113

5. 设置label测试
测试应该通过

1
2
kubectl run busybox --rm -ti --labels="access=true" --image=busybox /bin/sh
wget --spider --timeout=1 10.254.132.113

6. 清理

1
2
kubectl delete deploy nginx
kubectl delete svc nginx

配置参考文档
http://docs.projectcalico.org/v2.4/getting-started/kubernetes/installation/hosted/index#configuration-options

参考文档