Commit dddf414c authored by Eric Tune's avatar Eric Tune

Merge pull request #7195 from mbruzek/add-charms

Add the Juju charms to Kubernetes
parents 441a4e6f 74c00d43
# kubernetes-bundle
The kubernetes-bundle allows you to deploy the many services of
Kubernetes to a cloud environment and get started using the Kubernetes
technology quickly.
## Kubernetes
Kubernetes is an open source system for managing containerized
applications. Kubernetes uses [Docker](http://docker.com) to run
containerized applications.
## Juju TL;DR
The [Juju](https://juju.ubuntu.com) system provides provisioning and
orchestration across a variety of clouds and bare metal. A juju bundle
describes collection of services and how they interelate. `juju
quickstart` allows you to bootstrap a deployment environment and
deploy a bundle.
## Dive in!
#### Install Juju Quickstart
You will need to
[install the Juju client](https://juju.ubuntu.com/install/) and
`juju-quickstart` as pre-requisites. To deploy the bundle use
`juju-quickstart` which runs on Mac OS (`brew install
juju-quickstart`) or Ubuntu (`apt-get install juju-quickstart`).
### Deploy Kubernetes Bundle
Deploy Kubernetes onto any cloud and orchestrated directly in the Juju
Graphical User Interface using `juju quickstart`:
juju quickstart -i https://raw.githubusercontent.com/whitmo/bundle-kubernetes/master/bundles.yaml
The command above does few things for you:
- Starts a curses based gui for managing your cloud or MAAS credentials
- Looks for a bootstrapped deployment environment, and bootstraps if
required. This will launch a bootstrap node in your chosen
deployment environment (machine 0).
- Deploys the Juju GUI to your environment onto the bootstrap node.
- Provisions 4 machines, and deploys the Kubernetes services on top of
them (Kubernetes-master, two Kubernetes minions using flannel, and etcd).
- Orchestrates the relations among the services, and exits.
Now you should have a running Kubernetes. Run `juju status
--format=oneline` to see the address of your kubernetes master.
For further reading on [Juju Quickstart](https://pypi.python.org/pypi/juju-quickstart)
### Using the Kubernetes Client
You'll need the Kubernetes command line client,
[kubectl](https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/kubectl.md)
to interact with the created cluster. The kubectl command is
installed on the kubernetes-master charm. If you want to work with
the cluster from your computer you will need to install the binary
locally (see instructions below).
You can access kubectl by a number ways using juju.
via juju run:
juju run --service kubernetes-master/0 "sudo kubectl get mi"
via juju ssh:
juju ssh kubernetes-master/0 -t "sudo kubectl get mi"
You may also `juju ssh kubernetes-master/0` and call kubectl from that
machine.
See the
[kubectl documentation](https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/kubectl.md)
for more details of what can be done with the command line tool.
### Scaling up the cluster
You can add capacity by adding more Docker units:
juju add-unit docker
### Known Limitations
Kubernetes currently has several platform specific functionality. For
example load balancers and persistence volumes only work with the
Google Compute provider at this time.
The Juju integration uses the Kubernetes null provider. This means
external load balancers and storage can't be directly driven through
Kubernetes config files at this time. We look forward to adding these
capabilities to the charms.
## More about the components the bundle deploys
### Kubernetes master
The master controls the Kubernetes cluster. It manages for the worker
nodes and provides the primary interface for control by the user.
### Kubernetes minion
The minions are the servers that perform the work. Minions must
communicate with the master and run the workloads that are assigned to
them.
### Flannel-docker
Flannel provides individual subnets for each machine in the cluster by
creating a
[software defined networking](http://en.wikipedia.org/wiki/Software-defined_networking).
### Docker
An open platform for distributed applications for developers and sysadmins.
### Etcd
Etcd persists state for Flannel and Kubernetes. It is a distributed
key-value store with an http interface.
## For further information on getting started with Juju
Juju has complete documentation with regard to setup, and cloud
configuration on it's own
[documentation site](https://juju.ubuntu.com/docs/).
- [Getting Started](https://juju.ubuntu.com/docs/getting-started.html)
- [Using Juju](https://juju.ubuntu.com/docs/charms.html)
## Installing the kubectl outside of kubernetes master machine
Download the Kuberentes release from:
https://github.com/GoogleCloudPlatform/kubernetes/releases and extract
the release, you can then just directly use the cli binary at
./kubernetes/platforms/linux/amd64/kubectl
You'll need the address of the kubernetes-master as environment variable :
juju status kubernetes-master/0
Grab the public-address there and export it as KUBERNETES_MASTER
environment variable :
export KUBERNETES_MASTER=$(juju status --format=oneline kubernetes-master | cut -d' ' -f3):8080
And now you can run kubectl on the command line :
kubectl get mi
See the
[kubectl documentation](https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/kubectl.md)
for more details of what can be done with the command line tool.
## Hacking on the kubernetes-bundle and associated charms
The kubernetes-bundle is open source and available on github.com. If
you want to get started developing on the bundle you can clone it from
github. Often you will need the related charms which are also on
github.
mkdir ~/bundles
git clone https://github.com/whitmo/kubernetes-bundle.git ~/bundles/kubernetes-bundle
mkdir -p ~/charms/trusty
git clone https://github.com/whitmo/kubernetes-charm.git ~/charms/trusty/kubernetes
git clone https://github.com/whitmo/kubernetes-master-charm.git ~/charms/trusty/kubernetes-master
juju quickstart specs/develop.yaml
## How to contribute
Send us pull requests! We'll send you a cookie if they include tests and docs.
## Current and Most Complete Information
- [kubernetes-master charm on Github](https://github.com/whitmo/charm-kubernetes-master)
- [kubernetes charm on GitHub](https://github.com/whitmo/charm-kubernetes)
- [etcd charm on GitHub](https://github.com/whitmo/etcd-charm)
- [Flannel charm on GitHub](https://github.com/chuckbutler/docker-flannel-charm)
- [Docker charm on GitHub](https://github.com/chuckbutler/docker-charm)
More information about the
[Kubernetes project](https://github.com/GoogleCloudPlatform/kubernetes)
or check out the
[Kubernetes Documentation](https://github.com/GoogleCloudPlatform/kubernetes/tree/master/docs)
for more details about the Kubernetes concepts and terminology.
Having a problem? Check the [Kubernetes issues database](https://github.com/GoogleCloudPlatform/kubernetes/issues)
for related issues.
kubernetes-local:
services:
kubernetes-master:
charm: local:trusty/kubernetes-master
annotations:
"gui-x": "600"
"gui-y": "0"
expose: true
options:
version: "v0.15.0"
docker:
charm: docker
branch: https://github.com/chuckbutler/docker-charm.git
num_units: 2
options:
latest: true
annotations:
"gui-x": "0"
"gui-y": "0"
flannel-docker:
charm: cs:trusty/flannel-docker
annotations:
"gui-x": "0"
"gui-y": "300"
kubernetes:
charm: local:trusty/kubernetes
annotations:
"gui-x": "300"
"gui-y": "300"
etcd:
charm: cs:~kubernetes/trusty/etcd
annotations:
"gui-x": "300"
"gui-y": "0"
relations:
- - "flannel-docker:network"
- "docker:network"
- - "flannel-docker:docker-host"
- "docker:juju-info"
- - "flannel-docker:db"
- "etcd:client"
- - "kubernetes:docker-host"
- "docker:juju-info"
- - "etcd:client"
- "kubernetes:etcd"
- - "etcd:client"
- "kubernetes-master:etcd"
- - "kubernetes-master:minions-api"
- "kubernetes:api"
series: trusty
/docker
\ No newline at end of file
*~
.bzr
.venv
unit_tests/__pycache__
*.pyc
omit:
- .git
- .gitignore
- .gitmodules
- revision
build: virtualenv lint test
virtualenv:
virtualenv .venv
.venv/bin/pip install -q -r requirements.txt
lint: virtualenv
@.venv/bin/flake8 hooks unit_tests --exclude=charmhelpers
@.venv/bin/charm proof
test: virtualenv
@CHARM_DIR=. PYTHONPATH=./hooks .venv/bin/py.test -v unit_tests/*
functional-test:
@bundletester
release: check-path virtualenv
@.venv/bin/pip install git-vendor
@.venv/bin/git-vendor sync -d ${KUBERNETES_MASTER_BZR}
check-path:
ifndef KUBERNETES_MASTER_BZR
$(error KUBERNETES_MASTER_BZR is undefined)
endif
clean:
rm -rf .venv
find -name *.pyc -delete
# Kubernetes Master Charm
[Kubernetes](https://github.com/googlecloudplatform/kubernetes) is an open
source system for managing containerized applications across multiple hosts.
Kubernetes uses [Docker](http://www.docker.io/) to package, instantiate and run
containerized applications.
The Kubernetes Juju charms enable you to run Kubernetes on all the cloud
platforms that Juju supports.
A Kubernetes deployment consists of several independent charms that can be
scaled to meet your needs
### Etcd
Etcd is a key value store for Kubernetes. All persistent master state
is stored in `etcd`.
### Flannel-docker
Flannel is a
[software defined networking](http://en.wikipedia.org/wiki/Software-defined_networking)
component that provides individual subnets for each machine in the cluster.
### Docker
Docker is an open platform for distributing applications for system administrators.
### Kubernetes master
The controlling unit in a Kubernetes cluster is called the master. It is the
main management contact point providing many management services for the worker
nodes.
### Kubernetes minion
The servers that perform the work are known as minions. Minions must be able to
communicate with the master and run the workloads that are assigned to them.
## Usage
#### Deploying the Development Focus
To deploy a Kubernetes environment in Juju :
juju deploy cs:~kubernetes/trusty/etcd
juju deploy cs:trusty/flannel-docker
juju deploy cs:trusty/docker
juju deploy local:trusty/kubernetes-master
juju deploy local:trusty/kubernetes
juju add-relation etcd flannel-docker
juju add-relation flannel-docker:network docker:network
juju add-relation flannel-docker:docker-host docker
juju add-relation etcd kubernetes
juju add-relation etcd kubernetes-master
juju add-relation kubernetes kubernetes-master
#### Deploying the recommended configuration
A bundle can be used to deploy Kubernetes onto any cloud it can be
orchestrated directly in the Juju Graphical User Interface, when using
`juju quickstart`:
juju quickstart https://raw.githubusercontent.com/whitmo/bundle-kubernetes/master/bundles.yaml
For more information on the recommended bundle deployment, see the
[Kubernetes bundle documentation](https://github.com/whitmo/bundle-kubernetes)
#### Post Deployment
To interact with the kubernetes environment, either build or
[download](https://github.com/GoogleCloudPlatform/kubernetes/releases) the
[kubectl](https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/kubectl.md)
binary (available in the releases binary tarball) and point it to the master with :
$ juju status kubernetes-master | grep public
public-address: 104.131.108.99
$ export KUBERNETES_MASTER="104.131.108.99"
# Configuration
For you convenience this charm supports changing the version of kubernetes binaries.
This can be done through the Juju GUI or on the command line:
juju set kubernetes version=”v0.10.0”
If the charm does not already contain the tar file with the desired architecture
and version it will attempt to download the kubernetes binaries using the gsutil
command.
Congratulations you know have deployed a Kubernetes environment! Use the
[kubectl](https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/kubectl.md)
to interact with the environment.
# Kubernetes information
- [Kubernetes github project](https://github.com/GoogleCloudPlatform/kubernetes)
- [Kubernetes issue tracker](https://github.com/GoogleCloudPlatform/kubernetes/issues)
- [Kubernetes Documenation](https://github.com/GoogleCloudPlatform/kubernetes/tree/master/docs)
- [Kubernetes releases](https://github.com/GoogleCloudPlatform/kubernetes/releases)
options:
version:
type: string
default: "v0.15.0"
description: |
The kubernetes release to use in this charm. The binary files are
compiled from the source identified by this tag in github. Using the
value of "source" will use the master kubernetes branch when compiling
the binaries.
Copyright 2015 Google Inc. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
description "Kubernetes Controller"
start on runlevel [2345]
stop on runlevel [!2345]
limit nofile 20000 20000
kill timeout 30 # wait 30s between SIGTERM and SIGKILL.
exec /usr/local/bin/apiserver \
--address=%(api_bind_address)s \
--etcd_servers=%(etcd_servers)s \
--logtostderr=true \
--portal_net=10.244.240.0/20
description "Kubernetes Controller"
start on runlevel [2345]
stop on runlevel [!2345]
limit nofile 20000 20000
kill timeout 30 # wait 30s between SIGTERM and SIGKILL.
exec /usr/local/bin/controller-manager \
--address=%(bind_address)s \
--logtostderr=true \
--master=%(api_server_address)s
server {
listen %(api_bind_address)s:80;
location %(web_uri)s {
alias /opt/kubernetes/_output/local/bin/linux/amd64/;
}
}
# HTTP/HTTPS server
#
server {
listen 80;
server_name localhost;
root html;
index index.html index.htm;
# ssl on;
# ssl_certificate /usr/share/nginx/server.cert;
# ssl_certificate_key /usr/share/nginx/server.key;
# ssl_session_timeout 5m;
# ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
# ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;
# ssl_prefer_server_ciphers on;
location / {
# auth_basic "Restricted";
# auth_basic_user_file /usr/share/nginx/htpasswd;
# Proxy settings
# disable buffering so that watch works
proxy_buffering off;
proxy_pass %(api_server_address)s;
proxy_connect_timeout 159s;
proxy_send_timeout 600s;
proxy_read_timeout 600s;
# Disable retry
proxy_next_upstream off;
# Support web sockets
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
description "Kubernetes Scheduler"
start on runlevel [2345]
stop on runlevel [!2345]
limit nofile 20000 20000
kill timeout 30 # wait 30s between SIGTERM and SIGKILL.
exec /usr/local/bin/scheduler \
--address=%(bind_address)s \
--logtostderr=true \
--master=%(api_server_address)s
#!/usr/bin/python
"""
The main hook file is called by Juju.
"""
import contextlib
import os
import socket
import subprocess
import sys
from charmhelpers.core import hookenv, host
from kubernetes_installer import KubernetesInstaller
from path import path
hooks = hookenv.Hooks()
@contextlib.contextmanager
def check_sentinel(filepath):
"""
A context manager method to write a file while the code block is doing
something and remove the file when done.
"""
fail = False
try:
yield filepath.exists()
except:
fail = True
filepath.touch()
raise
finally:
if fail is False and filepath.exists():
filepath.remove()
@hooks.hook('config-changed')
def config_changed():
"""
On the execution of the juju event 'config-changed' this function
determines the appropriate architecture and the configured version to
create kubernetes binary files.
"""
hookenv.log('Starting config-changed')
charm_dir = path(hookenv.charm_dir())
config = hookenv.config()
# Get the version of kubernetes to install.
version = config['version']
# Get the package architecture, rather than the from the kernel (uname -m).
arch = subprocess.check_output(['dpkg', '--print-architecture']).strip()
kubernetes_dir = path('/opt/kubernetes')
if not kubernetes_dir.exists():
print('The source directory {0} does not exist'.format(kubernetes_dir))
print('Was the kubernetes code cloned during install?')
exit(1)
if version in ['source', 'head', 'master']:
branch = 'master'
else:
# Create a branch to a tag.
branch = 'tags/{0}'.format(version)
# Construct the path to the binaries using the arch.
output_path = kubernetes_dir / '_output/local/bin/linux' / arch
installer = KubernetesInstaller(arch, version, output_path)
# Change to the kubernetes directory (git repository).
with kubernetes_dir:
# Create a command to get the current branch.
git_branch = 'git branch | grep "\*" | cut -d" " -f2'
current_branch = subprocess.check_output(git_branch, shell=True).strip()
print('Current branch: ', current_branch)
# Create the path to a file to indicate if the build was broken.
broken_build = charm_dir / '.broken_build'
# write out the .broken_build file while this block is executing.
with check_sentinel(broken_build) as last_build_failed:
print('Last build failed: ', last_build_failed)
# Rebuild if the current version is different or last build failed.
if current_branch != version or last_build_failed:
installer.build(branch)
if not output_path.exists():
broken_build.touch()
else:
print('Notifying minions of verison ' + version)
# Notify the minions of a version change.
for r in hookenv.relation_ids('minions-api'):
hookenv.relation_set(r, version=version)
print('Done notifing minions of version ' + version)
# Create the symoblic links to the right directories.
installer.install()
relation_changed()
hookenv.log('The config-changed hook completed successfully.')
@hooks.hook('etcd-relation-changed', 'minions-api-relation-changed')
def relation_changed():
template_data = get_template_data()
# Check required keys
for k in ('etcd_servers',):
if not template_data.get(k):
print "Missing data for", k, template_data
return
print "Running with\n", template_data
# Render and restart as needed
for n in ('apiserver', 'controller-manager', 'scheduler'):
if render_file(n, template_data) or not host.service_running(n):
host.service_restart(n)
# Render the file that makes the kubernetes binaries available to minions.
if render_file(
'distribution', template_data,
'conf.tmpl', '/etc/nginx/sites-enabled/distribution') or \
not host.service_running('nginx'):
host.service_reload('nginx')
# Render the default nginx template.
if render_file(
'nginx', template_data,
'conf.tmpl', '/etc/nginx/sites-enabled/default') or \
not host.service_running('nginx'):
host.service_reload('nginx')
# Send api endpoint to minions
notify_minions()
def notify_minions():
print("Notify minions.")
config = hookenv.config()
for r in hookenv.relation_ids('minions-api'):
hookenv.relation_set(
r,
hostname=hookenv.unit_private_ip(),
port=8080,
version=config['version'])
def get_template_data():
rels = hookenv.relations()
config = hookenv.config()
template_data = {}
template_data['etcd_servers'] = ",".join([
"http://%s:%s" % (s[0], s[1]) for s in sorted(
get_rel_hosts('etcd', rels, ('hostname', 'port')))])
template_data['minions'] = ",".join(get_rel_hosts('minions-api', rels))
template_data['api_bind_address'] = _bind_addr(hookenv.unit_private_ip())
template_data['bind_address'] = "127.0.0.1"
template_data['api_server_address'] = "http://%s:%s" % (
hookenv.unit_private_ip(), 8080)
arch = subprocess.check_output(['dpkg', '--print-architecture']).strip()
template_data['web_uri'] = "/kubernetes/%s/local/bin/linux/%s/" % (
config['version'], arch)
_encode(template_data)
return template_data
def _bind_addr(addr):
if addr.replace('.', '').isdigit():
return addr
try:
return socket.gethostbyname(addr)
except socket.error:
raise ValueError("Could not resolve private address")
def _encode(d):
for k, v in d.items():
if isinstance(v, unicode):
d[k] = v.encode('utf8')
def get_rel_hosts(rel_name, rels, keys=('private-address',)):
hosts = []
for r, data in rels.get(rel_name, {}).items():
for unit_id, unit_data in data.items():
if unit_id == hookenv.local_unit():
continue
values = [unit_data.get(k) for k in keys]
if not all(values):
continue
hosts.append(len(values) == 1 and values[0] or values)
return hosts
def render_file(name, data, src_suffix="upstart.tmpl", tgt_path=None):
tmpl_path = os.path.join(
os.environ.get('CHARM_DIR'), 'files', '%s.%s' % (name, src_suffix))
with open(tmpl_path) as fh:
tmpl = fh.read()
rendered = tmpl % data
if tgt_path is None:
tgt_path = '/etc/init/%s.conf' % name
if os.path.exists(tgt_path):
with open(tgt_path) as fh:
contents = fh.read()
if contents == rendered:
return False
with open(tgt_path, 'w') as fh:
fh.write(rendered)
return True
if __name__ == '__main__':
hooks.execute(sys.argv)
#!/usr/bin/python
import setup
setup.pre_install()
import subprocess
from charmhelpers.core import hookenv
from charmhelpers import fetch
from charmhelpers.fetch import archiveurl
from path import path
def install():
install_packages()
hookenv.log('Installing go')
download_go()
hookenv.log('Adding kubernetes and go to the path')
strings = [
'export GOROOT=/usr/local/go\n',
'export PATH=$PATH:$GOROOT/bin\n',
'export KUBE_MASTER_IP=0.0.0.0\n',
'export KUBERNETES_MASTER=http://$KUBE_MASTER_IP\n',
]
update_rc_files(strings)
hookenv.log('Downloading kubernetes code')
clone_repository()
hookenv.open_port(8080)
hookenv.log('Install complete')
def download_go():
"""
Kubernetes charm strives to support upstream. Part of this is installing a
fairly recent edition of GO. This fetches the golang archive and installs
it in /usr/local
"""
go_url = 'https://storage.googleapis.com/golang/go1.4.2.linux-amd64.tar.gz'
go_sha1 = '5020af94b52b65cc9b6f11d50a67e4bae07b0aff'
handler = archiveurl.ArchiveUrlFetchHandler()
handler.install(go_url, '/usr/local', go_sha1, 'sha1')
def clone_repository():
"""
Clone the upstream repository into /opt/kubernetes for deployment compilation
of kubernetes. Subsequently used during upgrades.
"""
repository = 'https://github.com/GoogleCloudPlatform/kubernetes.git'
kubernetes_directory = '/opt/kubernetes'
command = ['git', 'clone', repository, kubernetes_directory]
print(command)
output = subprocess.check_output(command)
print(output)
def install_packages():
"""
Install required packages to build the k8s source, and syndicate between
minion nodes. In addition, fetch pip to handle python dependencies
"""
hookenv.log('Installing Debian packages')
# Create the list of packages to install.
apt_packages = ['build-essential', 'git', 'make', 'nginx', 'python-pip']
fetch.apt_install(fetch.filter_installed_packages(apt_packages))
def update_rc_files(strings):
"""
Preseed the bash environment for ubuntu and root with K8's env vars to
make interfacing with the api easier. (see: kubectrl docs)
"""
rc_files = [path('/home/ubuntu/.bashrc'), path('/root/.bashrc')]
for rc_file in rc_files:
lines = rc_file.lines()
for string in strings:
if string not in lines:
lines.append(string)
rc_file.write_lines(lines)
if __name__ == "__main__":
install()
import os
import shlex
import subprocess
from path import path
def run(command, shell=False):
""" A convience method for executing all the commands. """
print(command)
if shell is False:
command = shlex.split(command)
output = subprocess.check_output(command, shell=shell)
print(output)
return output
class KubernetesInstaller():
"""
This class contains the logic needed to install kuberentes binary files.
"""
def __init__(self, arch, version, output_dir):
""" Gather the required variables for the install. """
# The kubernetes-master charm needs certain commands to be aliased.
self.aliases = {'kube-apiserver': 'apiserver',
'kube-controller-manager': 'controller-manager',
'kube-proxy': 'kube-proxy',
'kube-scheduler': 'scheduler',
'kubectl': 'kubectl',
'kubelet': 'kubelet'}
self.arch = arch
self.version = version
self.output_dir = path(output_dir)
def build(self, branch):
""" Build kubernetes from a github repository using the Makefile. """
# Remove any old build artifacts.
make_clean = 'make clean'
run(make_clean)
# Always checkout the master to get the latest repository information.
git_checkout_cmd = 'git checkout master'
run(git_checkout_cmd)
# When checking out a tag, delete the old branch (not master).
if branch != 'master':
git_drop_branch = 'git branch -D {0}'.format(self.version)
print(git_drop_branch)
rc = subprocess.call(git_drop_branch.split())
if rc != 0:
print('returned: %d' % rc)
# Make sure the git repository is up-to-date.
git_fetch = 'git fetch origin {0}'.format(branch)
run(git_fetch)
if branch == 'master':
git_reset = 'git reset --hard origin/master'
run(git_reset)
else:
# Checkout a branch of kubernetes so the repo is correct.
checkout = 'git checkout -b {0} {1}'.format(self.version, branch)
run(checkout)
# Create an environment with the path to the GO binaries included.
go_path = ('/usr/local/go/bin', os.environ.get('PATH', ''))
go_env = os.environ.copy()
go_env['PATH'] = ':'.join(go_path)
print(go_env['PATH'])
# Compile the binaries with the make command using the WHAT variable.
make_what = "make all WHAT='cmd/kube-apiserver cmd/kubectl "\
"cmd/kube-controller-manager plugin/cmd/kube-scheduler "\
"cmd/kubelet cmd/kube-proxy'"
print(make_what)
rc = subprocess.call(shlex.split(make_what), env=go_env)
def install(self, install_dir=path('/usr/local/bin')):
""" Install kubernetes binary files from the output directory. """
if not install_dir.isdir():
install_dir.makedirs_p()
# Create the symbolic links to the real kubernetes binaries.
for key, value in self.aliases.iteritems():
target = self.output_dir / key
if target.exists():
link = install_dir / value
if link.exists():
link.remove()
target.symlink(link)
else:
print('Error target file {0} does not exist.'.format(target))
exit(1)
def pre_install():
"""
Do any setup required before the install hook.
"""
install_charmhelpers()
install_path()
def install_charmhelpers():
"""
Install the charmhelpers library, if not present.
"""
try:
import charmhelpers # noqa
except ImportError:
import subprocess
subprocess.check_call(['apt-get', 'install', '-y', 'python-pip'])
subprocess.check_call(['pip', 'install', 'charmhelpers'])
def install_path():
"""
Install the path.py library, when not present.
"""
try:
import path # noqa
except ImportError:
import subprocess
subprocess.check_call(['apt-get', 'install', '-y', 'python-pip'])
subprocess.check_call(['pip', 'install', 'path.py'])
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="96"
height="96"
id="svg6517"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="icon.svg">
<defs
id="defs6519">
<linearGradient
id="Background">
<stop
id="stop4178"
offset="0"
style="stop-color:#b8b8b8;stop-opacity:1" />
<stop
id="stop4180"
offset="1"
style="stop-color:#c9c9c9;stop-opacity:1" />
</linearGradient>
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Inner Shadow"
id="filter1121">
<feFlood
flood-opacity="0.59999999999999998"
flood-color="rgb(0,0,0)"
result="flood"
id="feFlood1123" />
<feComposite
in="flood"
in2="SourceGraphic"
operator="out"
result="composite1"
id="feComposite1125" />
<feGaussianBlur
in="composite1"
stdDeviation="1"
result="blur"
id="feGaussianBlur1127" />
<feOffset
dx="0"
dy="2"
result="offset"
id="feOffset1129" />
<feComposite
in="offset"
in2="SourceGraphic"
operator="atop"
result="composite2"
id="feComposite1131" />
</filter>
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Drop Shadow"
id="filter950">
<feFlood
flood-opacity="0.25"
flood-color="rgb(0,0,0)"
result="flood"
id="feFlood952" />
<feComposite
in="flood"
in2="SourceGraphic"
operator="in"
result="composite1"
id="feComposite954" />
<feGaussianBlur
in="composite1"
stdDeviation="1"
result="blur"
id="feGaussianBlur956" />
<feOffset
dx="0"
dy="1"
result="offset"
id="feOffset958" />
<feComposite
in="SourceGraphic"
in2="offset"
operator="over"
result="composite2"
id="feComposite960" />
</filter>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath873">
<g
transform="matrix(0,-0.66666667,0.66604479,0,-258.25992,677.00001)"
id="g875"
inkscape:label="Layer 1"
style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline">
<path
style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline"
d="m 46.702703,898.22775 50.594594,0 C 138.16216,898.22775 144,904.06497 144,944.92583 l 0,50.73846 c 0,40.86071 -5.83784,46.69791 -46.702703,46.69791 l -50.594594,0 C 5.8378378,1042.3622 0,1036.525 0,995.66429 L 0,944.92583 C 0,904.06497 5.8378378,898.22775 46.702703,898.22775 Z"
id="path877"
inkscape:connector-curvature="0"
sodipodi:nodetypes="sssssssss" />
</g>
</clipPath>
<filter
inkscape:collect="always"
id="filter891"
inkscape:label="Badge Shadow">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.71999962"
id="feGaussianBlur893" />
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6568542"
inkscape:cx="23.374724"
inkscape:cy="29.018169"
inkscape:document-units="px"
inkscape:current-layer="layer3"
showgrid="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1791"
inkscape:window-height="1057"
inkscape:window-x="488"
inkscape:window-y="175"
inkscape:window-maximized="0"
showborder="true"
showguides="true"
inkscape:guide-bbox="true"
inkscape:showpageshadow="false">
<inkscape:grid
type="xygrid"
id="grid821" />
<sodipodi:guide
orientation="1,0"
position="16,48"
id="guide823" />
<sodipodi:guide
orientation="0,1"
position="64,80"
id="guide825" />
<sodipodi:guide
orientation="1,0"
position="80,40"
id="guide827" />
<sodipodi:guide
orientation="0,1"
position="64,16"
id="guide829" />
</sodipodi:namedview>
<metadata
id="metadata6522">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="BACKGROUND"
inkscape:groupmode="layer"
id="layer1"
transform="translate(268,-635.29076)"
style="display:inline">
<path
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none;filter:url(#filter1121)"
d="m -268,700.15563 0,-33.72973 c 0,-27.24324 3.88785,-31.13513 31.10302,-31.13513 l 33.79408,0 c 27.21507,0 31.1029,3.89189 31.1029,31.13513 l 0,33.72973 c 0,27.24325 -3.88783,31.13514 -31.1029,31.13514 l -33.79408,0 c -27.21517,0 -31.10302,-3.89189 -31.10302,-31.13514 z"
id="path6455"
inkscape:connector-curvature="0"
sodipodi:nodetypes="sssssssss" />
</g>
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="KUBERNETES"
style="display:inline">
<image
y="1.0763092"
x="15"
id="image4178"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAugAAAQcCAYAAADHiW6lAAAABHNCSVQICAgIfAhkiAAAIABJREFU eJzs3WeYVOXBxvH7zE7dzhY6LAsiKIIVRUTzWnkjmKhRI2rsJbFQFkQNKQQlJqgUJTH22MXE2Ah5 1aiJRsUKIopI2112KduBbTM7M+f9sDExBmSBmXnOzPx/X7wuy5zbZface555igQAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 s/WtA/x6Y1W7llcGtayqQ9uCUZV2c6tPfoZ65rsVjdqa/rft0i46/ACfpUcvKtZR+zmv1CXCttao lixr1fzXt+s9g9vKxUqmQ3cjCXhdKvJlqDKYnD/jlzaH9NJT9Rr3ZrOu/Fa2Thqe6difdby4LOkH x+VIki5+4RuOs7ek+Sd1nk7aGrLV2m4rwyV5PZaKcjLUu5tbQ3p75HPYBx3blpauDeq+17frodVt puMgNlgH+A2c9RuYSFMqHpClS03HQIxY0q3H5erco7M0wIELSb/J21+066fPNuq1mv+cElPitfTY xcUaMyT9Rs5bQ7ZeXtGqha9t16tbzR8GFSsvnl+o8Yc5c1bd+Llb9Ofq1Nj54vT+Pl19Qo6OPzCQ dtuQRm3pkTd26JKdlPTjijyafWa3pLunrNkS0v2v79CcD1gAmmLsYne0qHZOaYPpIE7krO+uEuno KXNkqch0DMTOqxVBvfxRq7pnujSwh0eeJHkw9yt0a+xBmQqE7H9t1djdY+mJi4p03NCA4XSJFYlK f/+0TTc83aBfvLVDG1JsYumlR2RrYHdnfoD868o2La9LzhH0r/t8W0SPLm9V7eaweudnqJdDtwWM B8uSRpT4VOp36fmvTHe56chs3fb9Ag3r65xvGnenuT2qRe8069LH6/Vntk1MRVZrNOPvemfeWtNB nCg9C/q1lUVy61dK528QUlRdh60/fNamioqQSos86pWfHG/xbL9L/3NAQKN6erSqIqTfnFOgE4el 11aKn1SGNPcvTbpqSVPSLf7sqh8ela1+hc4si3//rF1Lt6TOtxWS9EFNh+59r0WR7RH1K3Sr0GHz qePFsqSDS3walOnSsvKg7jqtm64Zm6f8zOT5/19eHtRNTzdq1jvNnASa2sr1zrzXTIdwImc+KeLN a48W5TylPbamXY+t26o7T8rVhNE5Kspx5raMX+VySd8+JFMjB/mTIm+sbGoM6+mlLfrpa9vjuoe8 Ezh5XnSmz7nZ9tUtS5v12LIW/ezkfJ15VJbyMlP/98uypPPH5Oi4A/wqKXLmtzY7s7kprEfebNaN f4vz3u5wCuah70Lq36V2jjdEOojamvjyNp3zm63668o2JUv3S5dy3hG29dwHLfruXTWa8tdtKV/O JSnT59w/Wydni4XyoK1LFzfqgntq9Mbn7bJT/+0ml6WkKeeRqPSX5a06fWEN5Tyt2Edp1orkmXeV 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 4ZK1syxtK8lvOhqANONohSxrvuR8Jcf+WJGMj1gpB1IHBTpg0ugFWbJzhsjn20mOymWpRI5dIsuX JcfJlqUc0xE9ICRZnaZDAMnlROU4LbKsJllWixynRXJa5DgLe+dmz994c/9W0wkBAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEf8PU2rA Bv/9DrkAAAAASUVORK5CYII= "
style="display:inline;image-rendering:optimizeSpeed"
preserveAspectRatio="none"
height="94.923691"
width="67.132347" />
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="BADGE"
style="display:none"
sodipodi:insensitive="true">
<g
style="display:inline"
transform="translate(-340.00001,-581)"
id="g4394"
clip-path="none">
<g
id="g855">
<g
inkscape:groupmode="maskhelper"
id="g870"
clip-path="url(#clipPath873)"
style="opacity:0.6;filter:url(#filter891)">
<circle
transform="matrix(1.4999992,0,0,1.4999992,-29.999795,-237.54282)"
id="path844"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;enable-background:accumulate"
cx="252"
cy="552.36218"
r="12" />
</g>
<g
id="g862">
<circle
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#f5f5f5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;enable-background:accumulate"
id="path4398"
transform="matrix(1.4999992,0,0,1.4999992,-29.999795,-238.54282)"
cx="252"
cy="552.36218"
r="12" />
<circle
transform="matrix(1.25,0,0,1.25,33,-100.45273)"
id="path4400"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#dd4814;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;enable-background:accumulate"
cx="252"
cy="552.36218"
r="12" />
<path
sodipodi:type="star"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#f5f5f5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;enable-background:accumulate"
id="path4459"
sodipodi:sides="5"
sodipodi:cx="666.19574"
sodipodi:cy="589.50385"
sodipodi:r1="7.2431178"
sodipodi:r2="4.3458705"
sodipodi:arg1="1.0471976"
sodipodi:arg2="1.6755161"
inkscape:flatsided="false"
inkscape:rounded="0.1"
inkscape:randomized="0"
d="m 669.8173,595.77657 c -0.39132,0.22593 -3.62645,-1.90343 -4.07583,-1.95066 -0.44938,-0.0472 -4.05653,1.36297 -4.39232,1.06062 -0.3358,-0.30235 0.68963,-4.03715 0.59569,-4.47913 -0.0939,-0.44198 -2.5498,-3.43681 -2.36602,-3.8496 0.18379,-0.41279 4.05267,-0.59166 4.44398,-0.81759 0.39132,-0.22593 2.48067,-3.48704 2.93005,-3.4398 0.44938,0.0472 1.81505,3.67147 2.15084,3.97382 0.3358,0.30236 4.08294,1.2817 4.17689,1.72369 0.0939,0.44198 -2.9309,2.86076 -3.11469,3.27355 -0.18379,0.41279 0.0427,4.27917 -0.34859,4.5051 z"
transform="matrix(1.511423,-0.16366377,0.16366377,1.511423,-755.37346,-191.93651)" />
</g>
</g>
</g>
</g>
</svg>
name: kubernetes-master
summary: Container Cluster Management Master
description: |
Provides a kubernetes api endpoint, scheduler for managing containers.
maintainers:
- Matt Bruzek <matt.bruzek@canonical.com>
- Whit Morriss <whit.morriss@canonical.com>
- Charles Butler <charles.butler@canonical.com>
tags:
- ops
- network
provides:
client-api:
interface: kubernetes-client
minions-api:
interface: kubernetes-api
requires:
etcd:
interface: etcd
kubernetes-master
-----------------
notes on src
------------
current provider responsibilities
- instances
- load blanacers
- zones (not useful as its only for apiserver).
provider functionality currently hardcoded to gce across codebase
- persistent storage
ideas
-----
- juju provider impl
- file provider for machines/minions
- openvpn as overlay per extant salt config.
cloud
-----
todo
----
- token auth file
- format csv -> token, user, uid
- config privileged
- config log-level
- config / check logs collection endpoint
- config / version and binary location via url
Q/A
----
https://botbot.me/freenode/google-containers/2014-10-17/?msg=23696683&page=6
Q. The new volumes/storage provider api appears to be hardcoded to
gce.. Is there a plan to abstract that anytime soon?
A. effectively it is abstract enough for the moment, no plans to
change, but willing subject to suitable abstraction.
Q.The zone provider api appears to return the address only of the api
server afaics. How is that useful? afaics the better semantic would be
an attribute on the minions to instantiate multiple templates across
zones?
A. apparently not considered, current solution for ha is multiple k8s
per zone with external lb. pointed out this was inane.
Q. Several previous platforms supported have been moved to the icebox,
just curious what was subject to bitrot. the salt/shell script for
those platforms or something more api intrinsic?
A. apparently the change to ship binaries instead of build from src
broke them.. somehow.
Q. i'm mostly interested in flannel due to its portability. Does the
inter pod networking setup need to include the other components of the
system, ie does api talk directly to containers, or only via kubelet.
A. api server only talks to kubelet
Q. Status of HA?
A. not done yet, election package merged, nothing using it.
Afaics design discussion doesn't take place on the list.
Q. Is minion registration supported, ie. bypassing cloud provider
filter all instances via regex match?
A. not done yet, pull request in review for minions in etcd (not
found, perhaps merged)
-------------
cadvisor usage helper
https://github.com/GoogleCloudPlatform/heapster
flake8
pytest
bundletester
path.py
charmhelpers
from mock import patch
from path import path
from path import Path
import pytest
import subprocess
import sys
# Add the hooks directory to the python path.
hooks_dir = Path('__file__').parent.abspath() / 'hooks'
sys.path.insert(0, hooks_dir.abspath())
# Import the module to be tested.
import kubernetes_installer
def test_run():
""" Test the run method both with valid commands and invalid commands. """
ls = 'ls -l {0}/kubernetes_installer.py'.format(hooks_dir)
output = kubernetes_installer.run(ls, False)
assert output
assert 'kubernetes_installer.py' in output
output = kubernetes_installer.run(ls, True)
assert output
assert 'kubernetes_installer.py' in output
invalid_directory = path('/not/a/real/directory')
assert not invalid_directory.exists()
invalid_command = 'ls {0}'.format(invalid_directory)
with pytest.raises(subprocess.CalledProcessError) as error:
kubernetes_installer.run(invalid_command)
print(error)
with pytest.raises(subprocess.CalledProcessError) as error:
kubernetes_installer.run(invalid_command, shell=True)
print(error)
class TestKubernetesInstaller():
def makeone(self, *args, **kw):
""" Create the KubernetesInstaller object and return it. """
from kubernetes_installer import KubernetesInstaller
return KubernetesInstaller(*args, **kw)
def test_init(self):
""" Test that the init method correctly assigns the variables. """
ki = self.makeone('i386', '3.0.1', '/tmp/does_not_exist')
assert ki.aliases
assert 'kube-apiserver' in ki.aliases
assert 'kube-controller-manager' in ki.aliases
assert 'kube-scheduler' in ki.aliases
assert 'kubectl' in ki.aliases
assert 'kubelet' in ki.aliases
assert ki.arch == 'i386'
assert ki.version == '3.0.1'
assert ki.output_dir == path('/tmp/does_not_exist')
@patch('kubernetes_installer.run')
@patch('kubernetes_installer.subprocess.call')
def test_build(self, cmock, rmock):
""" Test the build method with master and non-master branches. """
directory = path('/tmp/kubernetes_installer_test/build')
ki = self.makeone('amd64', 'v99.00.11', directory)
assert not directory.exists(), 'The %s directory exists!' % directory
# Call the build method with "master" branch.
ki.build("master")
# TODO: run is called many times but mock only remembers last one.
rmock.assert_called_with('git reset --hard origin/master')
# TODO: call is complex and hard to verify with mock, fix that.
cmock.assert_called_once()
# Call the build method with something other than "master" branch.
ki.build("branch")
# TODO: run is called many times, but mock only remembers last one.
rmock.assert_called_with('git checkout -b v99.00.11 branch')
# TODO: call is complex and hard to verify with mock, fix that.
cmock.assert_called_once()
directory.rmtree_p()
def test_install(self):
""" Test the install method that it creates the correct links. """
directory = path('/tmp/kubernetes_installer_test/install')
ki = self.makeone('ppc64le', '1.2.3', directory)
assert not directory.exists(), 'The %s directory exits!' % directory
directory.makedirs_p()
# Create the files for the install method to link to.
(directory / 'kube-apiserver').touch()
(directory / 'kube-controller-manager').touch()
(directory / 'kube-proxy').touch()
(directory / 'kube-scheduler').touch()
(directory / 'kubectl').touch()
(directory / 'kubelet').touch()
results = directory / 'install/results/go/here'
assert not results.exists()
ki.install(results)
assert results.isdir()
# Check that all the files were correctly aliased and are links.
assert (results / 'apiserver').islink()
assert (results / 'controller-manager').islink()
assert (results / 'kube-proxy').islink()
assert (results / 'scheduler').islink()
assert (results / 'kubectl').islink()
assert (results / 'kubelet').islink()
directory.rmtree_p()
from mock import patch, Mock, MagicMock
from path import Path
import pytest
import sys
# Munge the python path so we can find our hook code
d = Path('__file__').parent.abspath() / 'hooks'
sys.path.insert(0, d.abspath())
# Import the modules from the hook
import install
class TestInstallHook():
@patch('install.path')
def test_update_rc_files(self, pmock):
"""
Test happy path on updating env files. Assuming everything
exists and is in place.
"""
pmock.return_value.lines.return_value = ['line1', 'line2']
install.update_rc_files(['test1', 'test2'])
pmock.return_value.write_lines.assert_called_with(['line1', 'line2',
'test1', 'test2'])
def test_update_rc_files_with_nonexistant_path(self):
"""
Test an unhappy path if the bashrc/users do not exist.
"""
with pytest.raises(OSError) as exinfo:
install.update_rc_files(['test1','test2'])
@patch('install.fetch')
@patch('install.hookenv')
def test_package_installation(self, hemock, ftmock):
"""
Verify we are calling the known essentials to build and syndicate
kubes.
"""
pkgs = ['build-essential', 'git',
'make', 'nginx', 'python-pip']
install.install_packages()
hemock.log.assert_called_with('Installing Debian packages')
ftmock.filter_installed_packages.assert_called_with(pkgs)
@patch('install.archiveurl.ArchiveUrlFetchHandler')
def test_go_download(self, aumock):
"""
Test that we are actually handing off to charm-helpers to
download a specific archive of Go. This is non-configurable so
its reasonably safe to assume we're going to always do this,
and when it changes we shall curse the brittleness of this test.
"""
ins_mock = aumock.return_value.install
install.download_go()
url = 'https://storage.googleapis.com/golang/go1.4.2.linux-amd64.tar.gz'
sha1='5020af94b52b65cc9b6f11d50a67e4bae07b0aff'
ins_mock.assert_called_with(url, '/usr/local', sha1, 'sha1')
@patch('install.subprocess')
def test_clone_repository(self, spmock):
"""
We're not using a unit-tested git library - so ensure our subprocess
call is consistent. If we change this, we want to know we've broken it.
"""
install.clone_repository()
repo = 'https://github.com/GoogleCloudPlatform/kubernetes.git'
direct = '/opt/kubernetes'
spmock.check_output.assert_called_with(['git', 'clone', repo, direct])
@patch('install.install_packages')
@patch('install.download_go')
@patch('install.clone_repository')
@patch('install.update_rc_files')
@patch('install.hookenv')
def test_install_main(self, hemock, urmock, crmock, dgmock, ipmock):
"""
Ensure the driver/main method is calling all the supporting methods.
"""
strings = [
'export GOROOT=/usr/local/go\n',
'export PATH=$PATH:$GOROOT/bin\n',
'export KUBE_MASTER_IP=0.0.0.0\n',
'export KUBERNETES_MASTER=http://$KUBE_MASTER_IP\n',
]
install.install()
crmock.assert_called_once()
dgmock.assert_called_once()
crmock.assert_called_once()
urmock.assert_called_with(strings)
hemock.open_port.assert_called_with(8080)
.bzr
*.pyc
*~
*\#*
/files/.kubernetes-*
.venv
omit:
- .git
- .gitignore
- .gitmodules
- revision
build: virtualenv lint test
virtualenv:
virtualenv .venv
.venv/bin/pip install -q -r requirements.txt
lint: virtualenv
@.venv/bin/flake8 hooks unit_tests --exclude=charmhelpers
@.venv/bin/charm proof
test: virtualenv
@CHARM_DIR=. PYTHONPATH=./hooks .venv/bin/py.test unit_tests/*
functional-test:
@bundletester
release: check-path virtualenv
@.venv/bin/pip install git-vendor
@.venv/bin/git-vendor sync -d ${KUBERNETES_BZR}
check-path:
ifndef KUBERNETES_BZR
$(error KUBERNETES_BZR is undefined)
endif
clean:
rm -rf .venv
find -name *.pyc -delete
# Kubernetes Minion Charm
[Kubernetes](https://github.com/googlecloudplatform/kubernetes) is an open
source system for managing containerized applications across multiple hosts.
Kubernetes uses [Docker](http://www.docker.io/) to package, instantiate and run
containerized applications.
The Kubernetes Juju charms enable you to run Kubernetes on all the cloud
platforms that Juju supports.
A Kubernetes deployment consists of several independent charms that can be
scaled to meet your needs
### Etcd
Etcd is a key value store for Kubernetes. All persistent master state
is stored in `etcd`.
### Flannel-docker
Flannel is a
[software defined networking](http://en.wikipedia.org/wiki/Software-defined_networking)
component that provides individual subnets for each machine in the cluster.
### Docker
Docker is an open platform for distributing applications for system administrators.
### Kubernetes master
The controlling unit in a Kubernetes cluster is called the master. It is the
main management contact point providing many management services for the worker
nodes.
### Kubernetes minion
The servers that perform the work are known as minions. Minions must be able to
communicate with the master and run the workloads that are assigned to them.
## Usage
#### Deploying the Development Focus
To deploy a Kubernetes environment in Juju :
juju deploy cs:~kubernetes/trusty/etcd
juju deploy cs:trusty/flannel-docker
juju deploy cs:trusty/docker
juju deploy local:trusty/kubernetes-master
juju deploy local:trusty/kubernetes
juju add-relation etcd flannel-docker
juju add-relation flannel-docker:network docker:network
juju add-relation flannel-docker:docker-host docker
juju add-relation etcd kubernetes
juju add-relation etcd kubernetes-master
juju add-relation kubernetes kubernetes-master
#### Deploying the recommended configuration
A bundle can be used to deploy Kubernetes onto any cloud it can be
orchestrated directly in the Juju Graphical User Interface, when using
`juju quickstart`:
juju quickstart https://raw.githubusercontent.com/whitmo/bundle-kubernetes/master/bundles.yaml
For more information on the recommended bundle deployment, see the
[Kubernetes bundle documentation](https://github.com/whitmo/bundle-kubernetes)
#### Post Deployment
To interact with the kubernetes environment, either build or
[download](https://github.com/GoogleCloudPlatform/kubernetes/releases) the
[kubectl](https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/kubectl.md)
binary (available in the releases binary tarball) and point it to the master with :
$ juju status kubernetes-master | grep public
public-address: 104.131.108.99
$ export KUBERNETES_MASTER="104.131.108.99"
# Configuration
For you convenience this charm supports changing the version of kubernetes binaries.
This can be done through the Juju GUI or on the command line:
juju set kubernetes version=”v0.10.0”
If the charm does not already contain the tar file with the desired architecture
and version it will attempt to download the kubernetes binaries using the gsutil
command.
Congratulations you know have deployed a Kubernetes environment! Use the
[kubectl](https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/kubectl.md)
to interact with the environment.
# Kubernetes information
- [Kubernetes github project](https://github.com/GoogleCloudPlatform/kubernetes)
- [Kubernetes issue tracker](https://github.com/GoogleCloudPlatform/kubernetes/issues)
- [Kubernetes Documenation](https://github.com/GoogleCloudPlatform/kubernetes/tree/master/docs)
- [Kubernetes releases](https://github.com/GoogleCloudPlatform/kubernetes/releases)
Copyright 2015 Google Inc. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
description "cadvisor container metrics"
start on started docker
stop on stopping docker
limit nofile 20000 20000
kill timeout 60 # wait 60s between SIGTERM and SIGKILL.
exec docker run \
--volume=/var/run:/var/run:rw \
--volume=/sys/fs/cgroup:/sys/fs/cgroup:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--publish=127.0.0.1:4193:8080 \
--name=cadvisor \
google/cadvisor:latest
description "kubernetes kubelet"
start on runlevel [2345]
stop on runlevel [!2345]
limit nofile 20000 20000
kill timeout 60 # wait 60s between SIGTERM and SIGKILL.
exec /usr/local/bin/kubelet \
--address=%(kubelet_bind_addr)s \
--api_servers=%(kubeapi_server)s \
--hostname_override=%(kubelet_bind_addr)s \
--cadvisor_port=4193 \
--logtostderr=true
description "kubernetes proxy"
start on runlevel [2345]
stop on runlevel [!2345]
limit nofile 20000 20000
kill timeout 60 # wait 60s between SIGTERM and SIGKILL.
exec /usr/local/bin/proxy \
--master=%(kubeapi_server)s \
--logtostderr=true
#!/usr/bin/python
"""
The main hook file that is called by Juju.
"""
import json
import httplib
import os
import time
import socket
import subprocess
import sys
import urlparse
from charmhelpers.core import hookenv, host
from kubernetes_installer import KubernetesInstaller
from path import path
from lib.registrator import Registrator
hooks = hookenv.Hooks()
@hooks.hook('api-relation-changed')
def api_relation_changed():
"""
On the relation to the api server, this function determines the appropriate
architecture and the configured version to copy the kubernetes binary files
from the kubernetes-master charm and installs it locally on this machine.
"""
hookenv.log('Starting api-relation-changed')
charm_dir = path(hookenv.charm_dir())
# Get the package architecture, rather than the from the kernel (uname -m).
arch = subprocess.check_output(['dpkg', '--print-architecture']).strip()
kubernetes_bin_dir = path('/opt/kubernetes/bin')
# Get the version of kubernetes to install.
version = subprocess.check_output(['relation-get', 'version']).strip()
print('Relation version: ', version)
if not version:
print('No version present in the relation.')
exit(0)
version_file = charm_dir / '.version'
if version_file.exists():
previous_version = version_file.text()
print('Previous version: ', previous_version)
if version == previous_version:
exit(0)
# Can not download binaries while the service is running, so stop it.
# TODO: Figure out a better way to handle upgraded kubernetes binaries.
for service in ('kubelet', 'proxy'):
if host.service_running(service):
host.service_stop(service)
command = ['relation-get', 'private-address']
# Get the kubernetes-master address.
server = subprocess.check_output(command).strip()
print('Kubernetes master private address: ', server)
installer = KubernetesInstaller(arch, version, server, kubernetes_bin_dir)
installer.download()
installer.install()
# Write the most recently installed version number to the file.
version_file.write_text(version)
relation_changed()
@hooks.hook('etcd-relation-changed',
'network-relation-changed')
def relation_changed():
"""Connect the parts and go :-)
"""
template_data = get_template_data()
# Check required keys
for k in ('etcd_servers', 'kubeapi_server'):
if not template_data.get(k):
print('Missing data for %s %s' % (k, template_data))
return
print('Running with\n%s' % template_data)
# Setup kubernetes supplemental group
setup_kubernetes_group()
# Register upstart managed services
for n in ('kubelet', 'proxy'):
if render_upstart(n, template_data) or not host.service_running(n):
print('Starting %s' % n)
host.service_restart(n)
# Register machine via api
print('Registering machine')
register_machine(template_data['kubeapi_server'])
# Save the marker (for restarts to detect prev install)
template_data.save()
def get_template_data():
rels = hookenv.relations()
template_data = hookenv.Config()
template_data.CONFIG_FILE_NAME = '.unit-state'
overlay_type = get_scoped_rel_attr('network', rels, 'overlay_type')
etcd_servers = get_rel_hosts('etcd', rels, ('hostname', 'port'))
api_servers = get_rel_hosts('api', rels, ('hostname', 'port'))
# kubernetes master isn't ha yet.
if api_servers:
api_info = api_servers.pop()
api_servers = 'http://%s:%s' % (api_info[0], api_info[1])
template_data['overlay_type'] = overlay_type
template_data['kubelet_bind_addr'] = _bind_addr(
hookenv.unit_private_ip())
template_data['proxy_bind_addr'] = _bind_addr(
hookenv.unit_get('public-address'))
template_data['kubeapi_server'] = api_servers
template_data['etcd_servers'] = ','.join([
'http://%s:%s' % (s[0], s[1]) for s in sorted(etcd_servers)])
template_data['identifier'] = os.environ['JUJU_UNIT_NAME'].replace(
'/', '-')
return _encode(template_data)
def _bind_addr(addr):
if addr.replace('.', '').isdigit():
return addr
try:
return socket.gethostbyname(addr)
except socket.error:
raise ValueError('Could not resolve private address')
def _encode(d):
for k, v in d.items():
if isinstance(v, unicode):
d[k] = v.encode('utf8')
return d
def get_scoped_rel_attr(rel_name, rels, attr):
private_ip = hookenv.unit_private_ip()
for r, data in rels.get(rel_name, {}).items():
for unit_id, unit_data in data.items():
if unit_data.get('private-address') != private_ip:
continue
if unit_data.get(attr):
return unit_data.get(attr)
def get_rel_hosts(rel_name, rels, keys=('private-address',)):
hosts = []
for r, data in rels.get(rel_name, {}).items():
for unit_id, unit_data in data.items():
if unit_id == hookenv.local_unit():
continue
values = [unit_data.get(k) for k in keys]
if not all(values):
continue
hosts.append(len(values) == 1 and values[0] or values)
return hosts
def render_upstart(name, data):
tmpl_path = os.path.join(
os.environ.get('CHARM_DIR'), 'files', '%s.upstart.tmpl' % name)
with open(tmpl_path) as fh:
tmpl = fh.read()
rendered = tmpl % data
tgt_path = '/etc/init/%s.conf' % name
if os.path.exists(tgt_path):
with open(tgt_path) as fh:
contents = fh.read()
if contents == rendered:
return False
with open(tgt_path, 'w') as fh:
fh.write(rendered)
return True
def register_machine(apiserver, retry=False):
parsed = urlparse.urlparse(apiserver)
# identity = hookenv.local_unit().replace('/', '-')
private_address = hookenv.unit_private_ip()
with open('/proc/meminfo') as fh:
info = fh.readline()
mem = info.strip().split(':')[1].strip().split()[0]
cpus = os.sysconf('SC_NPROCESSORS_ONLN')
registration_request = Registrator()
registration_request.data['Kind'] = 'Minion'
registration_request.data['id'] = private_address
registration_request.data['name'] = private_address
registration_request.data['metadata']['name'] = private_address
registration_request.data['spec']['capacity']['mem'] = mem + ' K'
registration_request.data['spec']['capacity']['cpu'] = cpus
registration_request.data['spec']['externalID'] = private_address
registration_request.data['status']['hostIP'] = private_address
response, result = registration_request.register(parsed.hostname,
parsed.port,
'/api/v1beta3/nodes')
print(response)
try:
registration_request.command_succeeded(response, result)
except ValueError:
# This happens when we have already registered
# for now this is OK
pass
def setup_kubernetes_group():
output = subprocess.check_output(['groups', 'kubernetes'])
# TODO: check group exists
if 'docker' not in output:
subprocess.check_output(
['usermod', '-a', '-G', 'docker', 'kubernetes'])
if __name__ == '__main__':
hooks.execute(sys.argv)
#!/bin/bash
set -ex
# Install is guaranteed to run once per rootfs
echo "Installing kubernetes-node on $JUJU_UNIT_NAME"
apt-get update -qq
apt-get install -q -y \
bridge-utils \
python-dev \
python-pip \
wget
pip install path.py
# Create the necessary kubernetes group.
groupadd kubernetes
useradd -d /var/lib/kubernetes \
-g kubernetes \
-s /sbin/nologin \
--system \
kubernetes
install -d -m 0744 -o kubernetes -g kubernetes /var/lib/kubernetes
install -d -m 0744 -o kubernetes -g kubernetes /etc/kubernetes/manifests
# wait for the world, depends on where we installed it from distro
#sudo service docker.io stop
# or upstream archive
#sudo service docker stop
import subprocess
from path import path
class KubernetesInstaller():
"""
This class contains the logic needed to install kuberentes binary files.
"""
def __init__(self, arch, version, master, output_dir):
""" Gather the required variables for the install. """
# The kubernetes charm needs certain commands to be aliased.
self.aliases = {'kube-proxy': 'proxy',
'kubelet': 'kubelet'}
self.arch = arch
self.version = version
self.master = master
self.output_dir = output_dir
def download(self):
""" Download the kuberentes binaries from the kubernetes master. """
url = 'http://{0}/kubernetes/{1}/local/bin/linux/{2}'.format(
self.master, self.version, self.arch)
if not self.output_dir.isdir():
self.output_dir.makedirs_p()
for key in self.aliases:
uri = '{0}/{1}'.format(url, key)
destination = self.output_dir / key
wget = 'wget -nv {0} -O {1}'.format(uri, destination)
print(wget)
output = subprocess.check_output(wget.split())
print(output)
destination.chmod(0o755)
def install(self, install_dir=path('/usr/local/bin')):
""" Create links to the binary files to the install directory. """
if not install_dir.isdir():
install_dir.makedirs_p()
# Create the symbolic links to the real kubernetes binaries.
for key, value in self.aliases.iteritems():
target = self.output_dir / key
if target.exists():
link = install_dir / value
if link.exists():
link.remove()
target.symlink(link)
else:
print('Error target file {0} does not exist.'.format(target))
exit(1)
import httplib
import json
import time
class Registrator:
def __init__(self):
self.ds ={
"creationTimestamp": "",
"kind": "Minion",
"name": "", # private_address
"metadata": {
"name": "", #private_address,
},
"spec": {
"externalID": "", #private_address
"capacity": {
"mem": "", # mem + ' K',
"cpu": "", # cpus
}
},
"status": {
"conditions": [],
"hostIP": "", #private_address
}
}
@property
def data(self):
''' Returns a data-structure for population to make a request. '''
return self.ds
def register(self, hostname, port, api_path):
''' Contact the API Server for a new registration '''
headers = {"Content-type": "application/json",
"Accept": "application/json"}
connection = httplib.HTTPConnection(hostname, port)
print 'CONN {}'.format(connection)
connection.request("POST", api_path, json.dumps(self.data), headers)
response = connection.getresponse()
body = response.read()
print(body)
result = json.loads(body)
print("Response status:%s reason:%s body:%s" % \
(response.status, response.reason, result))
return response, result
def update(self):
''' Contact the API Server to update a registration '''
# do a get on the API for the node
# repost to the API with any modified data
pass
def save(self):
''' Marshall the registration data '''
# TODO
pass
def command_succeeded(self, response, result):
''' Evaluate response data to determine if the command was successful '''
if response.status in [200, 201]:
print("Registered")
return True
elif response.status in [409,]:
print("Status Conflict")
# Suggested return a PUT instead of a POST with this response
# code, this predicates use of the UPDATE method
# TODO
elif response.status in (500,) and result.get(
'message', '').startswith('The requested resource does not exist'):
# There's something fishy in the kube api here (0.4 dev), first time we
# go to register a new minion, we always seem to get this error.
# https://github.com/GoogleCloudPlatform/kubernetes/issues/1995
time.sleep(1)
print("Retrying registration...")
raise ValueError("Registration returned 500, retry")
# return register_machine(apiserver, retry=True)
else:
print("Registration error")
# TODO - get request data
raise RuntimeError("Unable to register machine with")
#!/bin/bash
set -ex
# Start is guaranteed to be called once when after the unit is installed
# *AND* once everytime a machine is rebooted.
if [ ! -f $CHARM_DIR/.unit-state ]
then
exit 0;
fi
service docker restart
service proxy restart
service kubelet restart
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="96"
height="96"
id="svg6517"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="icon.svg">
<defs
id="defs6519">
<linearGradient
id="Background">
<stop
id="stop4178"
offset="0"
style="stop-color:#b8b8b8;stop-opacity:1" />
<stop
id="stop4180"
offset="1"
style="stop-color:#c9c9c9;stop-opacity:1" />
</linearGradient>
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Inner Shadow"
id="filter1121">
<feFlood
flood-opacity="0.59999999999999998"
flood-color="rgb(0,0,0)"
result="flood"
id="feFlood1123" />
<feComposite
in="flood"
in2="SourceGraphic"
operator="out"
result="composite1"
id="feComposite1125" />
<feGaussianBlur
in="composite1"
stdDeviation="1"
result="blur"
id="feGaussianBlur1127" />
<feOffset
dx="0"
dy="2"
result="offset"
id="feOffset1129" />
<feComposite
in="offset"
in2="SourceGraphic"
operator="atop"
result="composite2"
id="feComposite1131" />
</filter>
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Drop Shadow"
id="filter950">
<feFlood
flood-opacity="0.25"
flood-color="rgb(0,0,0)"
result="flood"
id="feFlood952" />
<feComposite
in="flood"
in2="SourceGraphic"
operator="in"
result="composite1"
id="feComposite954" />
<feGaussianBlur
in="composite1"
stdDeviation="1"
result="blur"
id="feGaussianBlur956" />
<feOffset
dx="0"
dy="1"
result="offset"
id="feOffset958" />
<feComposite
in="SourceGraphic"
in2="offset"
operator="over"
result="composite2"
id="feComposite960" />
</filter>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath873">
<g
transform="matrix(0,-0.66666667,0.66604479,0,-258.25992,677.00001)"
id="g875"
inkscape:label="Layer 1"
style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline">
<path
style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline"
d="m 46.702703,898.22775 50.594594,0 C 138.16216,898.22775 144,904.06497 144,944.92583 l 0,50.73846 c 0,40.86071 -5.83784,46.69791 -46.702703,46.69791 l -50.594594,0 C 5.8378378,1042.3622 0,1036.525 0,995.66429 L 0,944.92583 C 0,904.06497 5.8378378,898.22775 46.702703,898.22775 Z"
id="path877"
inkscape:connector-curvature="0"
sodipodi:nodetypes="sssssssss" />
</g>
</clipPath>
<filter
inkscape:collect="always"
id="filter891"
inkscape:label="Badge Shadow">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.71999962"
id="feGaussianBlur893" />
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6568542"
inkscape:cx="23.374724"
inkscape:cy="29.018169"
inkscape:document-units="px"
inkscape:current-layer="layer3"
showgrid="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1791"
inkscape:window-height="1057"
inkscape:window-x="488"
inkscape:window-y="175"
inkscape:window-maximized="0"
showborder="true"
showguides="true"
inkscape:guide-bbox="true"
inkscape:showpageshadow="false">
<inkscape:grid
type="xygrid"
id="grid821" />
<sodipodi:guide
orientation="1,0"
position="16,48"
id="guide823" />
<sodipodi:guide
orientation="0,1"
position="64,80"
id="guide825" />
<sodipodi:guide
orientation="1,0"
position="80,40"
id="guide827" />
<sodipodi:guide
orientation="0,1"
position="64,16"
id="guide829" />
</sodipodi:namedview>
<metadata
id="metadata6522">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="BACKGROUND"
inkscape:groupmode="layer"
id="layer1"
transform="translate(268,-635.29076)"
style="display:inline">
<path
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none;filter:url(#filter1121)"
d="m -268,700.15563 0,-33.72973 c 0,-27.24324 3.88785,-31.13513 31.10302,-31.13513 l 33.79408,0 c 27.21507,0 31.1029,3.89189 31.1029,31.13513 l 0,33.72973 c 0,27.24325 -3.88783,31.13514 -31.1029,31.13514 l -33.79408,0 c -27.21517,0 -31.10302,-3.89189 -31.10302,-31.13514 z"
id="path6455"
inkscape:connector-curvature="0"
sodipodi:nodetypes="sssssssss" />
</g>
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="KUBERNETES"
style="display:inline">
<image
y="1.0763092"
x="15"
id="image4178"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAugAAAQcCAYAAADHiW6lAAAABHNCSVQICAgIfAhkiAAAIABJREFU eJzs3WeYVOXBxvH7zE7dzhY6LAsiKIIVRUTzWnkjmKhRI2rsJbFQFkQNKQQlJqgUJTH22MXE2Ah5 1aiJRsUKIopI2112KduBbTM7M+f9sDExBmSBmXnOzPx/X7wuy5zbZface555igQAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 s/WtA/x6Y1W7llcGtayqQ9uCUZV2c6tPfoZ65rsVjdqa/rft0i46/ACfpUcvKtZR+zmv1CXCttao lixr1fzXt+s9g9vKxUqmQ3cjCXhdKvJlqDKYnD/jlzaH9NJT9Rr3ZrOu/Fa2Thqe6difdby4LOkH x+VIki5+4RuOs7ek+Sd1nk7aGrLV2m4rwyV5PZaKcjLUu5tbQ3p75HPYBx3blpauDeq+17frodVt puMgNlgH+A2c9RuYSFMqHpClS03HQIxY0q3H5erco7M0wIELSb/J21+066fPNuq1mv+cElPitfTY xcUaMyT9Rs5bQ7ZeXtGqha9t16tbzR8GFSsvnl+o8Yc5c1bd+Llb9Ofq1Nj54vT+Pl19Qo6OPzCQ dtuQRm3pkTd26JKdlPTjijyafWa3pLunrNkS0v2v79CcD1gAmmLsYne0qHZOaYPpIE7krO+uEuno KXNkqch0DMTOqxVBvfxRq7pnujSwh0eeJHkw9yt0a+xBmQqE7H9t1djdY+mJi4p03NCA4XSJFYlK f/+0TTc83aBfvLVDG1JsYumlR2RrYHdnfoD868o2La9LzhH0r/t8W0SPLm9V7eaweudnqJdDtwWM B8uSRpT4VOp36fmvTHe56chs3fb9Ag3r65xvGnenuT2qRe8069LH6/Vntk1MRVZrNOPvemfeWtNB nCg9C/q1lUVy61dK528QUlRdh60/fNamioqQSos86pWfHG/xbL9L/3NAQKN6erSqIqTfnFOgE4el 11aKn1SGNPcvTbpqSVPSLf7sqh8ela1+hc4si3//rF1Lt6TOtxWS9EFNh+59r0WR7RH1K3Sr0GHz qePFsqSDS3walOnSsvKg7jqtm64Zm6f8zOT5/19eHtRNTzdq1jvNnASa2sr1zrzXTIdwImc+KeLN a48W5TylPbamXY+t26o7T8rVhNE5Kspx5raMX+VySd8+JFMjB/mTIm+sbGoM6+mlLfrpa9vjuoe8 Ezh5XnSmz7nZ9tUtS5v12LIW/ezkfJ15VJbyMlP/98uypPPH5Oi4A/wqKXLmtzY7s7kprEfebNaN f4vz3u5wCuah70Lq36V2jjdEOojamvjyNp3zm63668o2JUv3S5dy3hG29dwHLfruXTWa8tdtKV/O JSnT59w/Wydni4XyoK1LFzfqgntq9Mbn7bJT/+0ml6WkKeeRqPSX5a06fWEN5Tyt2Edp1orkmXeV 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 4ZK1syxtK8lvOhqANONohSxrvuR8Jcf+WJGMj1gpB1IHBTpg0ugFWbJzhsjn20mOymWpRI5dIsuX JcfJlqUc0xE9ICRZnaZDAMnlROU4LbKsJllWixynRXJa5DgLe+dmz994c/9W0wkBAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEf8PU2rA Bv/9DrkAAAAASUVORK5CYII= "
style="display:inline;image-rendering:optimizeSpeed"
preserveAspectRatio="none"
height="94.923691"
width="67.132347" />
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="BADGE"
style="display:none"
sodipodi:insensitive="true">
<g
style="display:inline"
transform="translate(-340.00001,-581)"
id="g4394"
clip-path="none">
<g
id="g855">
<g
inkscape:groupmode="maskhelper"
id="g870"
clip-path="url(#clipPath873)"
style="opacity:0.6;filter:url(#filter891)">
<circle
transform="matrix(1.4999992,0,0,1.4999992,-29.999795,-237.54282)"
id="path844"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;enable-background:accumulate"
cx="252"
cy="552.36218"
r="12" />
</g>
<g
id="g862">
<circle
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#f5f5f5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;enable-background:accumulate"
id="path4398"
transform="matrix(1.4999992,0,0,1.4999992,-29.999795,-238.54282)"
cx="252"
cy="552.36218"
r="12" />
<circle
transform="matrix(1.25,0,0,1.25,33,-100.45273)"
id="path4400"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#dd4814;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;enable-background:accumulate"
cx="252"
cy="552.36218"
r="12" />
<path
sodipodi:type="star"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#f5f5f5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;enable-background:accumulate"
id="path4459"
sodipodi:sides="5"
sodipodi:cx="666.19574"
sodipodi:cy="589.50385"
sodipodi:r1="7.2431178"
sodipodi:r2="4.3458705"
sodipodi:arg1="1.0471976"
sodipodi:arg2="1.6755161"
inkscape:flatsided="false"
inkscape:rounded="0.1"
inkscape:randomized="0"
d="m 669.8173,595.77657 c -0.39132,0.22593 -3.62645,-1.90343 -4.07583,-1.95066 -0.44938,-0.0472 -4.05653,1.36297 -4.39232,1.06062 -0.3358,-0.30235 0.68963,-4.03715 0.59569,-4.47913 -0.0939,-0.44198 -2.5498,-3.43681 -2.36602,-3.8496 0.18379,-0.41279 4.05267,-0.59166 4.44398,-0.81759 0.39132,-0.22593 2.48067,-3.48704 2.93005,-3.4398 0.44938,0.0472 1.81505,3.67147 2.15084,3.97382 0.3358,0.30236 4.08294,1.2817 4.17689,1.72369 0.0939,0.44198 -2.9309,2.86076 -3.11469,3.27355 -0.18379,0.41279 0.0427,4.27917 -0.34859,4.5051 z"
transform="matrix(1.511423,-0.16366377,0.16366377,1.511423,-755.37346,-191.93651)" />
</g>
</g>
</g>
</g>
</svg>
name: kubernetes
summary: Container Cluster Management Node
maintainers:
- Matt Bruzek <matthew.bruzek@canonical.com>
- Whit Morriss <whit.morriss@canonical.com>
- Charles Butler <charles.butler@canonical.com>
description: |
Provides a kubernetes node for running containers
See http://goo.gl/CSggxE
tags:
- ops
- network
subordinate: true
requires:
etcd:
interface: etcd
api:
interface: kubernetes-api
network:
interface: overlay-network
docker-host:
interface: juju-info
scope: container
import json
from mock import MagicMock, patch, call
from path import Path
import pytest
import sys
d = Path('__file__').parent.abspath() / 'hooks'
sys.path.insert(0, d.abspath())
from lib.registrator import Registrator
class TestRegistrator():
def setup_method(self, method):
self.r = Registrator()
def test_data_type(self):
if type(self.r.data) is not dict:
pytest.fail("Invalid type")
@patch('json.loads')
@patch('httplib.HTTPConnection')
def test_register(self, httplibmock, jsonmock):
result = self.r.register('foo', 80, '/v1beta1/test')
httplibmock.assert_called_with('foo', 80)
requestmock = httplibmock().request
requestmock.assert_called_with(
"POST", "/v1beta1/test",
json.dumps(self.r.data),
{"Content-type": "application/json",
"Accept": "application/json"})
def test_command_succeeded(self):
response = MagicMock()
result = json.loads('{"status": "Failure", "kind": "Status", "code": 409, "apiVersion": "v1beta2", "reason": "AlreadyExists", "details": {"kind": "minion", "id": "10.200.147.200"}, "message": "minion \\"10.200.147.200\\" already exists", "creationTimestamp": null}')
response.status = 200
self.r.command_succeeded(response, result)
response.status = 500
with pytest.raises(RuntimeError):
self.r.command_succeeded(response, result)
response.status = 409
with pytest.raises(ValueError):
self.r.command_succeeded(response, result)
# import pytest
class TestHooks():
# TODO: Actually write tests.
def test_fake(self):
pass
......@@ -20,12 +20,12 @@ set -o nounset
set -o pipefail
function check_for_ppa(){
function check_for_ppa() {
local repo="$1"
grep -qsw $repo /etcc/apt/sources.list /etc/apt/sources.list.d/*
grep -qsw $repo /etc/apt/sources.list /etc/apt/sources.list.d/*
}
function package_status(){
function package_status() {
local pkgname=$1
local pkgstatus
pkgstatus=$(dpkg-query -W --showformat='${Status}\n' "${pkgname}")
......@@ -33,10 +33,9 @@ function package_status(){
echo "Missing package ${pkgname}"
sudo apt-get --force-yes --yes install ${pkgname}
fi
}
function gather_installation_reqs(){
function gather_installation_reqs() {
if ! check_for_ppa "juju"; then
echo "... Detected missing dependencies.. running"
echo "... add-apt-repository ppa:juju/stable"
......@@ -45,5 +44,5 @@ function gather_installation_reqs(){
fi
package_status 'juju-quickstart'
package_status 'juju-deployer'
}
#!/usr/bin/env python
import json
import sys
# This script helps parse out the private IP addreses from the
# `juju run` command's JSON object, see cluster/juju/util.sh
if len(sys.argv) > 1:
# It takes the JSON output as the first argument.
nodes = json.loads(sys.argv[1])
# There can be multiple nodes to print the Stdout.
for num in nodes:
print num['Stdout'].rstrip()
else:
exit(1)
......@@ -19,8 +19,13 @@ set -o errexit
set -o nounset
set -o pipefail
source $KUBE_ROOT/cluster/juju/prereqs/ubuntu-juju.sh
KUBE_BUNDLE_URL='https://raw.githubusercontent.com/whitmo/bundle-kubernetes/master/bundles.yaml'
UTIL_SCRIPT=$(readlink -m "${BASH_SOURCE}")
JUJU_PATH=$(dirname ${UTIL_SCRIPT})
source ${JUJU_PATH}/prereqs/ubuntu-juju.sh
export JUJU_REPOSITORY=${JUJU_PATH}/charms
#KUBE_BUNDLE_URL='https://raw.githubusercontent.com/whitmo/bundle-kubernetes/master/bundles.yaml'
KUBE_BUNDLE_PATH=${JUJU_PATH}/bundles/local.yaml
function verify-prereqs() {
gather_installation_reqs
}
......@@ -30,66 +35,67 @@ function get-password() {
}
function kube-up() {
# If something were to happen that I'm not accounting for, do not
# punish the user by making them tear things down. In a perfect world
# quickstart should handle this situation, so be nice in the meantime
local envstatus
envstatus=$(juju status kubernetes-master --format=oneline)
if [[ "" == "${envstatus}" ]]; then
if [[ -d "~/.juju/current-env" ]]; then
juju quickstart -i --no-browser -i $KUBE_BUNDLE_URL
else
juju quickstart --no-browser ${KUBE_BUNDLE_URL}
fi
sleep 60
if [[ -d "~/.juju/current-env" ]]; then
juju quickstart -i --no-browser
else
juju quickstart --no-browser
fi
# The juju-deployer command will deploy the bundle and can be run
# multiple times to continue deploying the parts that fail.
juju deployer -c ${KUBE_BUNDLE_PATH}
# Sleep due to juju bug http://pad.lv/1432759
sleep-status
detect-master
detect-minions
}
function kube-down() {
local jujuenv
jujuenv=$(cat ~/.juju/current-environment)
juju destroy-environment $jujuenv
}
function detect-master() {
local kubestatus
# Capturing a newline, and my awk-fu was weak - pipe through tr -d
kubestatus=$(juju status --format=oneline kubernetes-master | awk '{print $3}' | tr -d "\n")
export KUBE_MASTER_IP=${kubestatus}
export KUBE_MASTER=$KUBE_MASTER_IP:8080
export KUBERNETES_MASTER=$KUBE_MASTER
}
export KUBE_MASTER=${KUBE_MASTER_IP}
export KUBERNETES_MASTER=http://${KUBE_MASTER}:8080
echo "Kubernetes master: " ${KUBERNETES_MASTER}
}
function detect-minions(){
# Strip out the components except for STDOUT return
# and trim out the single quotes to build an array of minions
function detect-minions() {
# Run the Juju command that gets the minion private IP addresses.
local ipoutput
ipoutput=$(juju run --service kubernetes "unit-get private-address" --format=json)
echo $ipoutput
# Strip out the IP addresses
#
# Example Output:
#- MachineId: "10"
# Stdout: '10.197.55.232
#'
# Stdout: |
# 10.197.55.232
# UnitId: kubernetes/0
# - MachineId: "11"
# Stdout: '10.202.146.124
# '
# Stdout: |
# 10.202.146.124
# UnitId: kubernetes/1
KUBE_MINION_IP_ADDRESSES=($(juju run --service kubernetes \
"unit-get private-address" --format=yaml \
| awk '/Stdout/ {gsub(/'\''/,""); print $2}'))
NUM_MINIONS=${#KUBE_MINION_IP_ADDRESSES[@]}
MINION_NAMES=$KUBE_MINION_IP_ADDRESSES
export KUBE_MINION_IP_ADDRESSES=($(${JUJU_PATH}/return-node-ips.py "${ipoutput}"))
echo "Kubernetes minions: " ${KUBE_MINION_IP_ADDRESSES[@]}
export NUM_MINIONS=${#KUBE_MINION_IP_ADDRESSES[@]}
export MINION_NAMES=$KUBE_MINION_IP_ADDRESSES
}
function setup-logging-firewall(){
function setup-logging-firewall() {
echo "TODO: setup logging and firewall rules"
}
function teardown-logging-firewall(){
function teardown-logging-firewall() {
echo "TODO: teardown logging and firewall rules"
}
function sleep-status(){
function sleep-status() {
local i
local maxtime
local jujustatus
......@@ -97,10 +103,17 @@ function sleep-status(){
maxtime=900
jujustatus=''
echo "Waiting up to 15 minutes to allow the cluster to come online... wait for it..."
jujustatus=$(juju status kubernetes-master --format=oneline)
if [[ $jujustatus == *"started"* ]];
then
return
fi
while [[ $i < $maxtime && $jujustatus != *"started"* ]]; do
sleep 15
i+=15
jujustatus=$(juju status kubernetes-master --format=oneline)
sleep 30
i+=30
done
# sleep because we cannot get the status back of where the minions are in the deploy phase
......@@ -109,4 +122,3 @@ function sleep-status(){
echo "Sleeping an additional minute to allow the cluster to settle"
sleep 60
}
## Getting start with Juju
## Getting started with Juju
Juju handles provisioning machines and deploying complex systems to a
wide number of clouds.
wide number of clouds, supporting service orchestration once the bundle of
services has been deployed.
### Prerequisites
> Note: If you're running kube-up, on ubuntu - all of the dependencies
> will be handled for you. You may safely skip to the section:
> [Launch Kubernetes Cluster](#launch-kubernetes-cluster)
#### On Ubuntu
[Install the Juju client](https://juju.ubuntu.com/install) on your
......@@ -39,13 +44,19 @@ interface.
## Launch Kubernetes cluster
juju quickstart https://raw.githubusercontent.com/whitmo/bundle-kubernetes/master/bundles.yaml
You will need to have the Kubernetes tools compiled before launching the cluster
make all WHAT=cmd/kubectl
export KUBERNETES_PROVIDER=juju
cluster/kube-up.sh
First this command will start a curses based gui allowing you to set
up credentials and other environmental settings for several different
providers including Azure and AWS.
If this is your first time running the `kube-up.sh` script, it will install
the required predependencies to get started with Juju, additionally it will
launch a curses based configuration utility allowing you to select your cloud
provider and enter the proper access credentials.
Next it will deploy the kubernetes master, etcd, 2 minions with flannel networking.
Next it will deploy the kubernetes master, etcd, 2 minions with flannel based
Software Defined Networking.
## Exploring the cluster
......@@ -53,14 +64,15 @@ Next it will deploy the kubernetes master, etcd, 2 minions with flannel networki
Juju status provides information about each unit in the cluster:
juju status --format=oneline
- etcd/0: 52.0.74.109 (started)
- flannel/0: 52.0.149.150 (started)
- flannel/1: 52.0.185.81 (started)
- juju-gui/0: 52.1.150.81 (started)
- kubernetes/0: 52.0.149.150 (started)
- kubernetes/1: 52.0.185.81 (started)
- kubernetes-master/0: 52.1.120.142 (started)
- docker/0: 52.4.92.78 (started)
- flannel-docker/0: 52.4.92.78 (started)
- kubernetes/0: 52.4.92.78 (started)
- docker/1: 52.6.104.142 (started)
- flannel-docker/1: 52.6.104.142 (started)
- kubernetes/1: 52.6.104.142 (started)
- etcd/0: 52.5.216.210 (started) 4001/tcp
- juju-gui/0: 52.5.205.174 (started) 80/tcp, 443/tcp
- kubernetes-master/0: 52.6.19.238 (started) 8080/tcp
You can use `juju ssh` to access any of the units:
......@@ -150,8 +162,7 @@ Finally delete the pod:
We can add minion units like so:
juju add-unit flannel # creates unit flannel/2
juju add-unit kubernetes --to flannel/2
juju add-unit docker # creates unit docker/2, kubernetes/2, docker-flannel/2
## Tear down cluster
......@@ -175,6 +186,16 @@ Kubernetes Bundle on Github
Juju runs natively against a variety of cloud providers and can be
made to work against many more using a generic manual provider.
Provider | v0.15.0
-------------- | -------
AWS | TBD
HPCloud | TBD
OpenStack | TBD
Joyent | TBD
Azure | TBD
Digital Ocean | TBD
MAAS (bare metal) | TBD
GCE | TBD
Provider | v0.8.1
......@@ -187,4 +208,3 @@ Azure | TBD
Digital Ocean | TBD
MAAS (bare metal) | TBD
GCE | TBD
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment