• Stars
    star
    550
  • Rank 80,860 (Top 2 %)
  • Language
    Go
  • License
    Apache License 2.0
  • Created over 6 years ago
  • Updated 26 days ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

CNI plugin for Alibaba Cloud VPC/ENI

Terway CNI Network Plugin

CNI plugin for Alibaba Cloud VPC/ENI

Go Report Card codecov Linter

English | 简体中文

Try It

Install Kubernetes

  • Prepare Aliyun ECS instance. The ECS OS we tested is Centos 7.4/7.6.
  • Install Kubernetes via kubeadm: create-cluster-kubeadm

After setup kubernetes cluster.

  • Change iptables Forward default policy to ACCEPT on every node of cluster: iptables -P FORWARD ACCEPT.
  • Check the rp_filter in sysctl parameters, set them to "0" on every node of cluster.

Make sure cluster up and healthy by kubectl get cs.

Install Terway network plugin


Terway plugin have two installation modes
  • VPC Mode

    VPC Mode, Using `Aliyun VPC` route table to connect the pods. Can assign dedicated ENI to Pod. Install method: <br />
    Replace `Network` and `access_key/access_secret` in [terway.yml](./terway.yml) with your cluster pod subnet and aliyun openapi credentials. Then use `kubectl apply -f terway.yml` to install Terway into kubernetes cluster.
  • ENI Secondary IP Mode

    ENI Secondary IP Mode, Using `Aliyun ENI's secondary ip` to connect the pods. This mode not limited by VPC route tables quotation. Install method: <br />
    Replace `access_key/access_secret` and `security_group/vswitches` in [terway-multiip.yml](./terway-multiip.yml) with your aliyun openapi credentials and resources id. Then use `kubectl apply -f terway-multiip.yml` to install Terway into kubernetes cluster.

Terway requires the access_key have following RAM Permissions

{
  "Version": "1",
  "Statement": [
    {
      "Action": [
        "ecs:CreateNetworkInterface",
        "ecs:DescribeNetworkInterfaces",
        "ecs:AttachNetworkInterface",
        "ecs:DetachNetworkInterface",
        "ecs:DeleteNetworkInterface",
        "ecs:DescribeInstanceAttribute",
        "ecs:DescribeInstanceTypes",
        "ecs:AssignPrivateIpAddresses",
        "ecs:UnassignPrivateIpAddresses",
        "ecs:DescribeInstances",
        "ecs:ModifyNetworkInterfaceAttribute"
      ],
      "Resource": [
        "*"
      ],
      "Effect": "Allow"
    },
    {
      "Action": [
        "vpc:DescribeVSwitches"
      ],
      "Resource": [
        "*"
      ],
      "Effect": "Allow"
    }
  ]
}

Using kubectl get ds terway -n kube-system to watch plugin launching. Plugin install completed while terway daemonset available pods equal to nodes.

Terway network plugin usage

Vpc network container

On VPC installation mode, Terway will config pod's address using node's podCidr when pod not have any special config. eg:

[root@iZj6c86lmr8k9rk78ju0ncZ ~]# kubectl run -it --rm --image busybox busybox
If you don't see a command prompt, try pressing enter.
/ # ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
3: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
    link/ether 46:02:02:6b:65:1e brd ff:ff:ff:ff:ff:ff
/ # ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
3: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
    link/ether 46:02:02:6b:65:1e brd ff:ff:ff:ff:ff:ff
    inet 172.30.0.4/24 brd 172.30.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::4402:2ff:fe6b:651e/64 scope link
       valid_lft forever preferred_lft forever

Using ENI network interface to get the performance equivalent to the underlying network

On VPC installation mode, Config eni request aliyun/eni: 1 in one container of pod. The following example will create an Nginx Pod and assign an ENI:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
    - name: nginx
      image: nginx
      resources:
        limits:
          aliyun/eni: 1
[root@iZj6c86lmr8k9rk78ju0ncZ ~]# kubectl exec -it nginx sh
# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UNKNOWN qlen 1000
    link/ether 00:16:3e:02:38:05 brd ff:ff:ff:ff:ff:ff
    inet 172.31.80.193/20 brd 172.31.95.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::216:3eff:fe02:3805/64 scope link
       valid_lft forever preferred_lft forever
4: veth1@if8: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
    link/ether 1e:60:c7:cb:1e:0e brd ff:ff:ff:ff:ff:ff
    inet6 fe80::1c60:c7ff:fecb:1e0e/64 scope link
       valid_lft forever preferred_lft forever

ENI Secondary IP Pod

On ENI secondary IP installation mode, Terway will create & allocate ENI secondary IP for pod. The IP of pod will in same IP Range:

[root@iZj6c86lmr8k9rk78ju0ncZ ~]# kubectl get pod -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP              NODE                                 NOMINATED NODE
nginx-64f497f8fd-ckpdm   1/1     Running   0          4d    192.168.0.191   cn-hangzhou.i-j6c86lmr8k9rk78ju0nc   <none>
[root@iZj6c86lmr8k9rk78ju0ncZ ~]# kubectl get node -o wide cn-hangzhou.i-j6c86lmr8k9rk78ju0nc
NAME                                 STATUS   ROLES    AGE   VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION              CONTAINER-RUNTIME
cn-hangzhou.i-j6c86lmr8k9rk78ju0nc   Ready    <none>   12d   v1.11.5   192.168.0.154   <none>        CentOS Linux 7 (Core)   3.10.0-693.2.2.el7.x86_64   docker://17.6.2
[root@iZj6c86lmr8k9rk78ju0ncZ ~]# kubectl exec -it nginx-64f497f8fd-ckpdm bash
root@nginx-64f497f8fd-ckpdm:/# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
3: eth0@if106: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 4a:60:eb:97:f4:07 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.0.191/32 brd 192.168.0.191 scope global eth0
       valid_lft forever preferred_lft forever

Using network policy to limit accessible between containers

The Terway plugin is compatible with NetworkPolicy in the standard K8S to control access between containers, for example:

  1. Create and expose an deployment for test

    [root@iZbp126bomo449eksjknkeZ ~]# kubectl run nginx --image=nginx --replicas=2
    deployment "nginx" created
    [root@iZbp126bomo449eksjknkeZ ~]# kubectl expose deployment nginx --port=80
    service "nginx" exposed
  2. Run busybox to test connection to deployment:

    [root@iZbp126bomo449eksjknkeZ ~]# kubectl run busybox --rm -ti --image=busybox /bin/sh
    If you don't see a command prompt, try pressing enter.
    / # wget --spider --timeout=1 nginx
    Connecting to nginx (172.21.0.225:80)
    / #
  3. Config network policy,only allow pod access which have run: nginx label:

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: access-nginx
    spec:
      podSelector:
      matchLabels:
        run: nginx
      ingress:
      - from:
      - podSelector:
        matchLabels:
          access: "true"
  4. The Pod access service without the specified label is rejected, and the container of the specified label can be accessed normally.

    [root@iZbp126bomo449eksjknkeZ ~]# kubectl run busybox --rm -ti --image=busybox /bin/sh
    If you don't see a command prompt, try pressing enter.
    / # wget --spider --timeout=1 nginx
    Connecting to nginx (172.21.0.225:80)
    wget: download timed out
    / #
    
    [root@iZbp126bomo449eksjknkeZ ~]# kubectl run busybox --rm -ti --labels="access=true" --image=busybox /bin/sh
    If you don't see a command prompt, try pressing enter.
    / # wget --spider --timeout=1 nginx
    Connecting to nginx (172.21.0.225:80)
    / #

Limit container in/out bandwidth

The Terway network plugin can limit the container's traffic via limit policy in pod's annotations. For example:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  annotations:
    kubernetes.io/ingress-bandwidth: 10M
    kubernetes.io/egress-bandwidth: 10M
spec:
  nodeSelector:
    kubernetes.io/hostname: cn-shanghai.i-uf63p6s96kf4jfh8wpwn
  containers:
    - name: nginx
      image: nginx:1.7.9
      ports:
        - containerPort: 80

Build Terway

Prerequisites:

  • Docker >= 17.05 with multi-stage build
docker build -t acs/terway:latest .

Test

unit test:

git clone https://github.com/AliyunContainerService/terway.git
docker run -i --rm \
  -v $(pwd)/terway:/go/src/github.com/AliyunContainerService/terway \
  -w /go/src/github.com/AliyunContainerService/terway \
  sunyuan3/gometalinter:v1 bash -c "go test -race ./..."

function test:

export KUBECONFIG=$HOME/.kube/config  # path to your kubeconfig file
cd terway/tests
go test -tags e2e -timeout 30m0s -v ./ 
  -args -trunk=true/false -policy=true/false

example:

go test -tags e2e -timeout 30m0s -v ./ 
  -args -trunk=false -policy=false

Contribute

You are welcome to make new issues and pull requests.

Built With

Felix: Terway's NetworkPolicy is implemented by integrating ProjectCalico's Felix components. Felix watch NetworkPolicy configuration and config ACL rules on container veth.

Cilium: In the IPvlan mode, Terway integrate Cilium components to support NetworkPolicy and optimize the Service performance. Cilium watch NetworkPolicy and Service configuration and inject ebpf program into pod's IPvlan slave device.

Community

DingTalk

Join DingTalk group by DingTalkGroup id "35924643".

More Repositories

1

k8s-for-docker-desktop

为Docker Desktop for Mac/Windows开启Kubernetes和Istio。
PowerShell
4,960
star
2

pouch

An Efficient Enterprise-class Container Engine
Go
4,626
star
3

log-pilot

Collect logs for docker containers
Go
1,429
star
4

gpushare-scheduler-extender

GPU Sharing Scheduler for Kubernetes Cluster
Go
1,403
star
5

kube-eventer

kube-eventer emit kubernetes events to sinks
Go
1,000
star
6

image-syncer

Docker image synchronization tool for Docker Registry V2 based services
Go
874
star
7

DevOps

阿里云容器服务持续交付
779
star
8

derrick

🐳A tool to help you containerize application in seconds
Go
685
star
9

gpushare-device-plugin

GPU Sharing Device Plugin for Kubernetes Cluster
Go
468
star
10

redis-cluster

HA Redis Cluster with Sentinel by Docker Compose
Shell
455
star
11

kubernetes-cronhpa-controller

⏰kubernetes-cronhpa-controller is a HPA controller that allows to scale your workload based on time schedule.
Go
443
star
12

docker-machine-driver-aliyunecs

Aliyun (Alibaba Cloud) ECS Driver of Docker Machine
Go
203
star
13

serverless-k8s-examples

Examples for Serverless Kubernetes on Alibaba Cloud - https://yq.aliyun.com/articles/591115
Go
158
star
14

ackdistro

Shell
122
star
15

flexvolume

FlexVolume plugin for Alibaba Cloud EBS/NAS/OSS, etc.
Go
109
star
16

jenkins-slaves

jenkins containerized slaves
Shell
107
star
17

alicloud-controller-manager

The official project is moved to https://github.com/kubernetes/cloud-provider-alibaba-cloud
Go
90
star
18

et-operator

Kubernetes Operator for AI and Bigdata Elastic Training
Go
84
star
19

sync-repo

Synchronize images from gcr.io, quay.io and Docker Hub to your Docker registry
Python
82
star
20

velero-plugin

Go
78
star
21

sgx-device-plugin

Kubernetes Device Plugin for Intel SGX
Go
67
star
22

alibaba-cloud-metrics-adapter

Kubernetes Custom Metrics API and External Metrics API for Alibaba Cloud
Go
55
star
23

maven-image

Maven Docker Image with Aliyun Mirror
Dockerfile
47
star
24

kubernetes-issues-solution

Kubernetes related issues solution
Shell
39
star
25

scaler

Java
39
star
26

roadmap

Product roadmap for Alibaba Cloud Container Services including ACK, ACR, ASK - Serverless K8S, ACK@Edge and ASM - Service Mesh
33
star
27

kube2ram

kube2ram provides different Alibaba Cloud RAM roles for pods running on ACK
Go
32
star
28

ack-ram-authenticator

Using Alibaba Cloud credentials to authenticate to a Kubernetes cluster
Go
31
star
29

alicloud-storage-provisioner

Alicloud Storage Provider for Kubernetes
Go
31
star
30

open-service-broker-alibabacloud

The Open Service Broker API implementation for Alibaba Cloud
Go
30
star
31

ack-image-builder

Custom Image Builder for ACK
Shell
28
star
32

ack-kms-plugin

KMS provider plugin for Alibaba Cloud
Go
27
star
33

spring-cloud-k8s-sample

This example demonstrate how to use AliCloud Container Service feature to build a spring-boot application leveraging with Spring Cloud capabilities.
Java
24
star
34

jenkins-demo

Java
23
star
35

spot-instance-advisor

spot-instance-advisor is command line tool to get the cheapest group of spot instanceTypes.
Go
22
star
36

solution-blockchain-demo

This is a repository for source codes of demo application and demo explorer for Blockchain Solution of Alibaba Cloud Container Service
JavaScript
22
star
37

helm-acr

Alibaba Cloud's Helm plugin to push chart package to ChartMuseum.
Go
22
star
38

docker-jenkins

Jenkins Docker Image which can set proper permission for local host volume
Shell
20
star
39

gpu-analyzer

GPU analyzer for Kubernetes GPU clusters
Go
17
star
40

ai-starter

Shell
17
star
41

benchmark-for-spark

benchmark-for-spark
HCL
16
star
42

terway-qos

The QoS project is a cloud-native solution leveraging eBPF technology, designed to efficiently manage and optimize network traffic across diverse hybrid deployment scenarios.
C
15
star
43

ack-secret-manager

ACK Secret Manager allows you to use external secret management systems (*e.g.*, Alibaba Cloud Secrets Manager) to securely add secrets in Kubernetes.
Go
15
star
44

kubeflow-aliyun

Deploy Kubeflow on Alibaba Cloud
14
star
45

monitoring-sample

Shell
13
star
46

cluster-api-provider-alibabacloud

Go
11
star
47

kubernetes-ops-handbook

Common kubernetes problems ops handbook.
10
star
48

hello-servicemesh-grpc

gRPC demo for ServiceMesh
Shell
9
star
49

jenkins-cos

Aliyun-Container-Service-plugin
Java
9
star
50

jenkins-on-serverless

9
star
51

rust-wasm-4-envoy

Shell
8
star
52

kubectl-autoscaler-plugin

7
star
53

ubuntu-image

Official Ubuntu Docker image with Aliyun mirror
7
star
54

centos-image

Official CentOS Docker image with Aliyun mirror
6
star
55

ack-ram-tool

Go
6
star
56

asm-labs

Go
6
star
57

ai-models-on-ack

Examples of deploying AI applications on ACK
Makefile
6
star
58

kubernetes-webhook-injector

Go
6
star
59

ghost-image

Ghost Blog Docker image with Aliyun OSS and MySQL
JavaScript
6
star
60

disk-snapshot

Support Aliyun Disk Snapshot in K8S without CSI Plugin
Go
5
star
61

prometheus-operator-charts

5
star
62

alibabacloud-ack-connector

Go
5
star
63

tsung-image

tsung docker image.
Shell
5
star
64

alpine-image

Official Alpine Docker Image with Aliyun Mirror
Shell
5
star
65

notation-alibabacloud-secret-manager

Go
4
star
66

data-on-ack

Examples of Data & AI/ML on Alibaba Cloud ACK by AI Suite
Go
4
star
67

debian-image

Official Debian Docker image with Aliyun mirror
3
star
68

demo-java

Java
3
star
69

node-resource-manager

3
star
70

nginx-sd-image

Python
2
star
71

demo-logstash

2
star
72

secrets-store-csi-driver-provider-alibaba-cloud

The Alibaba Cloud provider for the Secrets Store CSI Driver allows you to fetch secrets from Alibaba Cloud Secrets Manager and mount them into Kubernetes pods.
Go
2
star
73

python-image

Official Python image with Aliyun mirror of Pypi
Shell
2
star
74

grpc-transcoder

an envoyfiler generator for grpc-transcoder
Go
2
star
75

mpi-operator

Go
1
star
76

ack-tag-tool

Simple tool to tag all Alibaba Cloud resources used in specific ACK K8s cluster.
Python
1
star
77

wordpress-image

Official Wordpress Docker Image with Aliyun OSS plugin
PHP
1
star
78

haproxy-image

Official Haproxy Docker Image with Aliyun Mirror
1
star
79

cloud-environments

Makefile
1
star
80

argo-workflow-examples

Python
1
star
81

infrakit.aliyun

Infrakit plugins for Aliyun (Alibaba Cloud).
Go
1
star
82

node-image

Official NodeJS Docker Image with Taobao NPM mirror
1
star
83

demo-nodejs

JavaScript
1
star
84

gitops-demo

Smarty
1
star
85

ruby-image

Official Ruby Docker image with Ruby China mirror
Shell
1
star
86

jupyter-notebook

Jupyter Notebook Python, Scala, R, Spark, Mesos Stack
1
star
87

alibabacloud-erdma-controller

Go
1
star