“ 话不多说,直接开干”
01
—
准备工作
本次安装建议至少3台服务器或者虚拟机,建议配置至少2C4G,基本架构为1台master节点,2台node节点。整个安装过程将在Ubuntu 16.04.1上完成,包括完成kubeadm,kubernetes的基本集群和flannel网络的安装,节点信息如下:
操作系统版本

主机映射关系

02
—
安装kubeadm
以下步骤所有节点都必须执行一遍!!!
1、配置apt安装源
使用阿里的系统安装源和kubernetes源
$cat etc/apt/source.list
# 系统安装源
debhttp://mirrors.aliyun.com/ubuntu/xenial main restricted
debhttp://mirrors.aliyun.com/ubuntu/xenial-updates main restricted
debhttp://mirrors.aliyun.com/ubuntu/xenial universe
debhttp://mirrors.aliyun.com/ubuntu/xenial-updates universe
debhttp://mirrors.aliyun.com/ubuntu/xenial multiverse
debhttp://mirrors.aliyun.com/ubuntu/xenial-updates multiverse
debhttp://mirrors.aliyun.com/ubuntu/xenial-backports main restricted universemultiverse
#kubeadm及kubernetes组件安装源
debhttps://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
可以忽略gpg相关的警告
$sudo apt-get update
W: GPG error:https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial InRelease: Thefollowing signatures couldn't be verified because the public key is notavailable: NO_PUBKEY 6A030B21BA07F4FB W: The repository'https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial InRelease' is notsigned. N: Data from such a repository can't be authenticated and is thereforepotentially dangerous to use.
2、安装docker
$sudo apt-get install docker.io
Readingpackage lists... Done
Buildingdependency tree
Readingstate information... Done
docker.iois already the newest version (17.03.2-0ubuntu2~16.04.1).
0upgraded, 0 newly installed, 0 to remove and 222 not upgraded.
3、安装kubeadm,kubelet,kubectl
$sudo apt-get install -y kubelet kubeadm kubectl --allow-unauthenticated
Readingpackage lists... Done
Buildingdependency tree
Readingstate information... Done
kubeadmis already the newest version (1.11.1-00).
kubectlis already the newest version (1.11.1-00).
kubeletis already the newest version (1.11.1-00).
0upgraded, 0 newly installed, 0 to remove and 222 not upgraded.
03
—
使用kubeadm初始化master节点
1、配置科学上网
由于k8s的官方镜像都在gcr(google container registry)上,不科学上网无法下载;其次就算不用官方镜像库,使用别人搭建在github上的镜像库,也最好加速一下,不然下载速度感人,话不多说开干。
安装shadowsocks
由于shadowsocks是基于Python开发的,所以必须安装python,然后是python的包管理工具python-pip,最后是shadowsocks
$ sudoapt-get install python
$ sudoapt-get install python-pip
$ sudo pipinstall shadowsocks
配置shadowsocks
新建一个配置文件shadowsocks.json,然后配置相应的参数,里面的一些参数相信都应该懂的
$cat shadowsocks.json
{
"server":"your server",
"server_port":your server port,
"local_address":"127.0.0.1",
"local_port":1080,
"password":"your passwd",
"timeout":600,
"method":"aes-256-cfb"
}
启动shadowsocks
$ sudo sslocal -c shawdowsocks.json &
配置全局代理
启动shadowsocks服务后,发现并不能科学上网,这是因为shadowsocks是socks 5代理,需要客户端配合才能科学。为了让整个系统都走shadowsocks通道,需要配置全局代理,可以通过polipo实现。
安装polipo
$ sudo apt-get install polipo
配置polipo
$vim etc/polipo/config
logSyslog= true
logFile= var/log/polipo/polipo.log
proxyAddress= "0.0.0.0"
socksParentProxy= "127.0.0.1:1080"
socksProxyType= socks5
chunkHighMark= 50331648
objectHighMark= 16384
serverMaxSlots= 64
serverSlots= 16
serverSlots1= 32
重启polipo
$/etc/init.d/polipo restart
为终端配置http代理
$ exporthttp_proxy="http://127.0.0.1:8123/"
接着测试下能否科学上网,如果有响应,则全局代理配置成功
$ curlwww.google.com
注意事项,服务器重启后,下面两句需要重新执行:
$ sudo sslocal-c shadowsocks.json &
$ exporthttp_proxy="http://127.0.0.1:8123/"
2、手工下载k8s镜像
大牛在Github上搭建的镜像库,定时从gcr.io同步最新镜像
https://github.com/anjia0532/gcr.io_mirror/tree/master/google-containers
下载镜像时的转换方法
k8s.gcr.io/{image}/{tag} <==> gcr.io/google-containers/{image}/{tag} <==> anjia0532/google-containers.{image}/{tag}
kubernetes v1.11.0集群所需的镜像(截止到2018.7.29最新版本为v1.11.1,但镜像没有push到官方库上,无法pull,故使用v1.11.0)
k8s.gcr.io/kube-apiserver-amd64:v1.11.0
k8s.gcr.io/kube-controller-manager-amd64:v1.11.0
k8s.gcr.io/kube-scheduler-amd64:v1.11.0
k8s.gcr.io/kube-proxy-amd64:v1.11.0
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd-amd64:3.2.18
k8s.gcr.io/coredns:1.1.3
转换成github的镜像库后,再下载
sudo docker pull anjia0532/google-containers.kube-apiserver-amd64:v1.11.0
sudo docker pullanjia0532/google-containers.kube-controller-manager-amd64:v1.11.0
sudo docker pullanjia0532/google-containers.kube-scheduler-amd64:v1.11.0
sudo docker pullanjia0532/google-containers.kube-proxy-amd64:v1.11.0
sudo docker pullanjia0532/google-containers.pause:3.1
sudo docker pullanjia0532/google-containers.etcd-amd64:3.2.18
sudo docker pullanjia0532/google-containers.coredns:1.1.3
给镜像打新的tag
docker tag anjia0532/google-containers.kube-apiserver-amd64:v1.11.0k8s.gcr.io/kube-apiserver-amd64:v1.11.0
docker taganjia0532/google-containers.kube-controller-manager-amd64:v1.11.0k8s.gcr.io/kube-controller-manager-amd64:v1.11.0
docker taganjia0532/google-containers.kube-scheduler-amd64:v1.11.0k8s.gcr.io/kube-scheduler-amd64:v1.11.0
docker taganjia0532/google-containers.kube-proxy-amd64:v1.11.0k8s.gcr.io/kube-proxy-amd64:v1.11.0
docker taganjia0532/google-containers.pause:3.1 k8s.gcr.io/pause:3.1
docker taganjia0532/google-containers.etcd-amd64:3.2.18 k8s.gcr.io/etcd-amd64:3.2.18
docker taganjia0532/google-containers.coredns:1.1.3 k8s.gcr.io/coredns:1.1.3
3、初始化master
$kubeadm init --kubernetes-version=1.11.0 --pod-network-cidr=10.244.0.0/16--apiserver-advertise-address=172.17.0.11
--kubernetes-version 指定版本为1.11.0,否则默认是1.11.1;
--pod-network-cidr 设置kubernetes的子网为10.244.0.0/16,注意此处不要修改为其他地址,因为这个值与后续的flannel的yaml值要一致,如果修改,请一并修改。
--apiserver-advertise-address apiserver的地址,使用内网地址
4、配置 kubectl
kubectl 是管理 Kubernetes Cluster 的命令行工具,前面我们已经在所有的节点安装了 kubectl。Master 初始化完成后需要做一些配置工作,然后 kubectl 就能使用了。
推荐用 Linux 普通用户执行 kubectl(root 会有一些问题),我们为 ubuntu 用户配置 kubectl
mkdir-p $HOME/.kube
sudo cp -i/etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id-u):$(id -g) $HOME/.kube/config
为了使用更便捷,启用 kubectl 命令的自动补全功能,
echo"source <(kubectl completion bash)" >> ~/.bashrc
04
—
安装网络插件flannel
1、下载镜像
在k8s-master上下载镜像(科学上网只在k8s-master上配置)
$ sudo docker pull quay.io/coreos/flannel:v0.10.0-amd64
2、保存镜像,并拷贝到各个node节点上
保存的镜像有k8s.gcr.io/pause,quay.io/coreos/flannel,k8s.gcr.io/kube-proxy-amd64
k8s-master
$ sudo docker images
$ sudo docker save da86e6ba6ca1 f0fad859c909 1d3d7afd77d1 > node.tar
$ scp node.tar ubuntu@172.17.0.17:/tmp
$ scp node.tar ubuntu@172.17.0.15:/tmp
k8s-node1
$ sudo docker load < tmp/node.tar
$ sudo docker tag da86e6ba6ca1 k8s.gcr.io/pause:3.1
$ sudo docker tag f0fad859c909 quay.io/coreos/flannel:v0.10.0-amd64
$ sudo docker tag 1d3d7afd77d1 k8s.gcr.io/kube-proxy-amd64:v1.11.0
k8s-node2
$ sudo docker load < tmp/node.tar
$ sudo docker tag da86e6ba6ca1 k8s.gcr.io/pause:3.1
$ sudo docker tag f0fad859c909 quay.io/coreos/flannel:v0.10.0-amd64
$ sudo docker tag 1d3d7afd77d1 k8s.gcr.io/kube-proxy-amd64:v1.11.0
3、通过kube-flannel.yml创建flannel的pod
k8s-master
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
05
—
Node节点加入集群
1、k8s-master上查看token值
$ sudo kubeadm token list
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
54f68j.arg4usxkj5qyoaca <invalid> 2018-07-28T18:08:18+08:00 authentication,signing The default bootstrap token generated by 'kubeadm init'. system:bootstrappers:kubeadm:default-node-token
2、node节点加入集群
k8s-node1
$ kubeadm join --token 54f68j.arg4usxkj5qyoaca 172.17.0.11:6443 --discovery-token-unsafe-skip-ca-verification
k8s-node2
$ kubeadm join --token 54f68j.arg4usxkj5qyoaca 172.17.0.11:6443 --discovery-token-unsafe-skip-ca-verification
加入集群成功的显示,由于我当时没有截图,这是盗的参考资料里的图

3、查看pod状态和集群状态
所有的pod均是running状态时,表明已经OK了
$ kubectl get pod --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-78fcdf6894-jrh8p 1/1 Running 0 1d
kube-system coredns-78fcdf6894-kh65f 1/1 Running 0 1d
kube-system etcd-k8s-master 1/1 Running 0 1d
kube-system kube-apiserver-k8s-master 1/1 Running 0 1d
kube-system kube-controller-manager-k8s-master 1/1 Running 0 1d
kube-system kube-flannel-ds-amd64-6kwlk 1/1 Running 0 1d
kube-system kube-flannel-ds-amd64-8thxm 1/1 Running 0 1d
kube-system kube-flannel-ds-amd64-f2rjt 1/1 Running 0 1d
kube-system kube-proxy-h5k4v 1/1 Running 0 1d
kube-system kube-proxy-hsh5b 1/1 Running 0 1d
kube-system kube-proxy-lp55r 1/1 Running 0 1d
kube-system kube-scheduler-k8s-master 1/1 Running 0 1d
如果状态为Pending、ContainerCreating、ImagePullBackOff都表明 Pod 没有就绪,可以通过pod的Event排查下原因
$ kubectl describe pod kube-flannel-ds-amd64-f2rjt -n kube-system
查看所有节点的状态(version应该是v1.11.0,可能是因为我的kubectl版本是v1.11.1导致的,忽略)
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 1d v1.11.1
k8s-node1 Ready <none> 1d v1.11.1
k8s-node2 Ready <none> 1d v1.11.1




