Browse Source
Merge pull request #313 from Smana/choose_k8s_version
Merge pull request #313 from Smana/choose_k8s_version
Helper to change k8s versionpull/318/head
committed by
GitHub
9 changed files with 158 additions and 132 deletions
Split View
Diff Options
-
12roles/download/defaults/main.yml
-
2roles/download/tasks/main.yml
-
14roles/download/vars/kube_versions.yml
-
2roles/kubernetes/node/defaults/main.yml
-
12roles/uploads/defaults/main.yml
-
2roles/uploads/tasks/main.yml
-
14roles/uploads/vars/kube_versions.yml
-
115scripts/change_k8s_version.py
-
117scripts/change_k8s_version.sh
@ -0,0 +1,14 @@ |
|||
kube_checksum: |
|||
v1.2.2: |
|||
kube_apiserver: eb1bfd8b877052cbd1991b8c429a1d06661f4cb019905e20e128174f724e16de |
|||
kubectl: 473e6924569fba30d4a50cecdc2cae5f31d97d1f662463e85b74a472105dcff4 |
|||
kubelet: f16827dc7e7c82f0e215f0fc73eb01e2dfe91a2ec83f9cbcaf8d37c91b64fd3b |
|||
v1.2.3: |
|||
kube_apiserver_checksum: ebaeeeb72cb29b358337b330617a96355ff2d08a5a523fc1a81beba36cc9d6f9 |
|||
kubectl_checksum: 394853edd409a721bcafe4f1360009ef9f845050719fe7d6fc7176f45cc92a8c |
|||
kubelet_checksum: 633bb41c51c5c0df0645dd60ba82b12eba39d009eb87bae9227de7d9a89c0797 |
|||
v1.2.4: |
|||
kube_apiserver: 6ac99b36b02968459e026fcfc234207c66064b5e11816b69dd8fc234b2ffec1e |
|||
kubectl: dac61fbd506f7a17540feca691cd8a9d9d628d59661eebce788a50511f578897 |
|||
kubelet: 4adaf40592248eef6fd4fa126464915ea41e624a70dc77178089760ed235e341 |
|||
kube_version: v1.2.4 |
@ -0,0 +1,14 @@ |
|||
kube_checksum: |
|||
v1.2.2: |
|||
kube_apiserver: eb1bfd8b877052cbd1991b8c429a1d06661f4cb019905e20e128174f724e16de |
|||
kubectl: 473e6924569fba30d4a50cecdc2cae5f31d97d1f662463e85b74a472105dcff4 |
|||
kubelet: f16827dc7e7c82f0e215f0fc73eb01e2dfe91a2ec83f9cbcaf8d37c91b64fd3b |
|||
v1.2.3: |
|||
kube_apiserver_checksum: ebaeeeb72cb29b358337b330617a96355ff2d08a5a523fc1a81beba36cc9d6f9 |
|||
kubectl_checksum: 394853edd409a721bcafe4f1360009ef9f845050719fe7d6fc7176f45cc92a8c |
|||
kubelet_checksum: 633bb41c51c5c0df0645dd60ba82b12eba39d009eb87bae9227de7d9a89c0797 |
|||
v1.2.4: |
|||
kube_apiserver: 6ac99b36b02968459e026fcfc234207c66064b5e11816b69dd8fc234b2ffec1e |
|||
kubectl: dac61fbd506f7a17540feca691cd8a9d9d628d59661eebce788a50511f578897 |
|||
kubelet: 4adaf40592248eef6fd4fa126464915ea41e624a70dc77178089760ed235e341 |
|||
kube_version: v1.2.4 |
@ -0,0 +1,115 @@ |
|||
#!/usr/bin/env python |
|||
# -*- coding: utf-8 -*- |
|||
# Copyright 2016 Kubespray |
|||
# |
|||
# 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. |
|||
|
|||
import os |
|||
import sys |
|||
import hashlib |
|||
import urllib2 |
|||
import yaml |
|||
import argparse |
|||
import shutil |
|||
from re import sub |
|||
|
|||
|
|||
def get_remote_sha256_sum(url, max_file_size=100*1024*1024): |
|||
remote = urllib2.urlopen(url) |
|||
hash = hashlib.sha256() |
|||
total_read = 0 |
|||
while True: |
|||
data = remote.read(4096) |
|||
total_read += 4096 |
|||
if not data or total_read > max_file_size: |
|||
break |
|||
hash.update(data) |
|||
return hash.hexdigest() |
|||
|
|||
|
|||
def read_vars(var_file): |
|||
""" |
|||
Read the variables file |
|||
""" |
|||
try: |
|||
with open(var_file, "r") as f: |
|||
kargovars = yaml.load(f) |
|||
except: |
|||
print( |
|||
"Can't read variables file %s" % var_file |
|||
) |
|||
sys.exit(1) |
|||
return kargovars |
|||
|
|||
|
|||
def get_kube_sha256(version, download_url, binaries): |
|||
kube_sha256 = dict() |
|||
for k in binaries: |
|||
s = get_remote_sha256_sum(download_url + '/' + k) |
|||
kube_sha256[k] = s |
|||
kube_sha256['kube_apiserver'] = kube_sha256.pop('kube-apiserver') |
|||
return(kube_sha256) |
|||
|
|||
|
|||
def file_sub(file, regex, string): |
|||
"Substitute string in a file" |
|||
shutil.move(file, file + '~') |
|||
f = open(file + '~', 'r') |
|||
data = f.read() |
|||
o = open(file, 'w') |
|||
o.write(sub(regex, string, data)) |
|||
f.close() |
|||
o.close() |
|||
os.remove(file + '~') |
|||
|
|||
|
|||
if __name__ == '__main__': |
|||
parser = argparse.ArgumentParser( |
|||
prog='change_k8s_version', |
|||
description='%(prog)s changes the version to be installed with kargo', |
|||
) |
|||
|
|||
parser.add_argument( |
|||
'-v', '--version', dest='kube_version', required=True, |
|||
help="kubernetes version" |
|||
) |
|||
parser.add_argument( |
|||
'-r', '--repository', dest='docker_repository', required=True, |
|||
help="hyperkube docker repository" |
|||
) |
|||
args = parser.parse_args() |
|||
|
|||
kargo_root_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) |
|||
|
|||
file_sub( |
|||
os.path.join(kargo_root_path, 'roles/kubernetes/node/defaults/main.yml'), |
|||
r'.*hyperkube_image_repo.*', 'hyperkube_image_repo: "%s"' % args.docker_repository |
|||
) |
|||
file_sub( |
|||
os.path.join(kargo_root_path, 'roles/kubernetes/node/defaults/main.yml'), |
|||
r'.*hyperkube_image_tag.*', 'hyperkube_image_tag: "%s"' % args.kube_version |
|||
) |
|||
|
|||
kube_binaries = ['kubelet', 'kubectl', 'kube-apiserver'] |
|||
var_files = [ |
|||
os.path.join(kargo_root_path, 'roles/uploads/vars/kube_versions.yml'), |
|||
os.path.join(kargo_root_path, 'roles/download/vars/kube_versions.yml') |
|||
] |
|||
kube_download_url = "https://storage.googleapis.com/kubernetes-release/release/%s/bin/linux/amd64" % args.kube_version |
|||
|
|||
new = get_kube_sha256(args.kube_version, kube_download_url, kube_binaries) |
|||
for f in var_files: |
|||
current = read_vars(f) |
|||
current['kube_checksum'][args.kube_version] = new |
|||
with open(f, 'w') as out: |
|||
out.write(yaml.dump(current, indent=4, default_flow_style=False)) |
@ -1,117 +0,0 @@ |
|||
#!/bin/bash |
|||
|
|||
# This file is part of Kargo. |
|||
# |
|||
# Foobar is free software: you can redistribute it and/or modify |
|||
# it under the terms of the GNU General Public License as published by |
|||
# the Free Software Foundation, either version 3 of the License, or |
|||
# (at your option) any later version. |
|||
# |
|||
# Foobar is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU General Public License |
|||
# along with Foobar. If not, see <http://www.gnu.org/licenses/>. |
|||
|
|||
#color variables |
|||
txtbld=$(tput bold) # Bold |
|||
bldred=${txtbld}$(tput setaf 1) # red |
|||
bldgre=${txtbld}$(tput setaf 2) # green |
|||
bldylw=${txtbld}$(tput setaf 3) # yellow |
|||
txtrst=$(tput sgr0) # Reset |
|||
err=${bldred}ERROR${txtrst} |
|||
info=${bldgre}INFO${txtrst} |
|||
warn=${bldylw}WARNING${txtrst} |
|||
|
|||
usage() |
|||
{ |
|||
cat << EOF |
|||
Update ansible playbook with a specific kubernetes version |
|||
|
|||
Usage : $(basename $0) -v <k8s version> |
|||
-h | --help : Show this message |
|||
-i | --init : Initial upgrade (download binaries) |
|||
-v | --version : Kubernetes version |
|||
|
|||
ex : switch to kubernetes v1.2.4 |
|||
$(basename $0) -v v1.2.4 |
|||
EOF |
|||
} |
|||
|
|||
# Options parsing |
|||
while (($#)); do |
|||
case "$1" in |
|||
-h | --help) usage; exit 0;; |
|||
-i | --init) INIT=1; shift;; |
|||
-v | --version) VERS=${2}; shift 2;; |
|||
*) |
|||
usage |
|||
echo "ERROR : Unknown option" |
|||
exit 3 |
|||
;; |
|||
esac |
|||
done |
|||
|
|||
if [ -z ${VERS} ]; then |
|||
usage |
|||
echo -e "\n${err}: The option version must be defined" |
|||
exit 3 |
|||
else |
|||
if ! [[ ${VERS} =~ ^v[0-9]\.[0-9]\.[0-9]$ ]]; then |
|||
echo -e "\n${err}: Invalid version format (ex: v1.2.4)" |
|||
exit 1 |
|||
fi |
|||
fi |
|||
|
|||
UPLOAD_VARFILE="roles/uploads/defaults/main.yml" |
|||
DOWNLOAD_VARFILE="roles/download/defaults/main.yml" |
|||
K8S_BIN="kubelet kubectl kube-apiserver" |
|||
|
|||
if [[ ${INIT} -eq 1 ]]; then |
|||
DOWNLOAD_URL=https://storage.googleapis.com/kubernetes-release/release/${VERS}/bin/linux/amd64 |
|||
TMP_DIR=$(mktemp -d --tmpdir kubernetes_tmpbin_XXXXXXX) |
|||
sed -i "s/^hyperkube_image_tag.*$/hyperkube_image_tag: \"${VERS}\"/" roles/kubernetes/node/defaults/main.yml |
|||
trap 'rm -rf "${tmpdir}"' EXIT |
|||
cd "${tmpdir}" |
|||
|
|||
for BIN in ${K8S_BIN}; do |
|||
curl -s -o ${BIN} ${DOWNLOAD_URL}/${BIN} |
|||
if [ $? -ne 0 ]; then |
|||
echo -e "\n${err}: Downloading ${BIN} failed! Try again" |
|||
exit 1 |
|||
else |
|||
echo -e "\n${info}: ${BIN} downloaded successfuly" |
|||
fi |
|||
done |
|||
|
|||
for varfile in ${UPLOAD_VARFILE} ${DOWNLOAD_VARFILE}; do |
|||
sed -i "s/^kube_version.*$/kube_version: \"${VERS}\"/" ${varfile} |
|||
|
|||
for BIN in ${K8S_BIN}; do |
|||
CHECKSUM=$(sha256sum ${BIN} | cut -d' ' -f1) |
|||
BIN=$(echo ${BIN} | tr '-' '_') |
|||
sed -i "s/^${BIN}_checksum.*$/${BIN}_checksum: \"${CHECKSUM}\"/" ${varfile} |
|||
done |
|||
done |
|||
|
|||
rm -rf "${tmpdir}" |
|||
else |
|||
CHECKSUM_URL=https://storage.googleapis.com/kargo/${VERS}_k8s-sha256 |
|||
sed -i "s/^hyperkube_image_tag.*$/hyperkube_image_tag: \"${VERS}\"/" roles/kubernetes/node/defaults/main.yml |
|||
for varfile in ${UPLOAD_VARFILE} ${DOWNLOAD_VARFILE}; do |
|||
sed -i "s/^kube_version.*$/kube_version: \"${VERS}\"/" ${varfile} |
|||
for BIN in ${K8S_BIN}; do |
|||
if [[ "${BIN}" =~ "apiserver" ]]; then |
|||
BIN="apiserver" |
|||
fi |
|||
line=$(curl -sk ${CHECKSUM_URL} | grep ${BIN}) |
|||
CHECKSUM=$(echo ${line} | cut -d':' -f2) |
|||
if [[ "${BIN}" =~ "apiserver" ]]; then |
|||
BIN="kube_apiserver" |
|||
fi |
|||
sed -i "s/^${BIN}_checksum.*$/${BIN}_checksum: \"${CHECKSUM}\"/" ${varfile} |
|||
done |
|||
done |
|||
fi |
Write
Preview
Loading…
Cancel
Save