Ubuntu 16.04 安装Docker 和 Kubernetes
安装Docker
http://www.cnblogs.com/youran-he/p/9566059.html
http://www.cnblogs.com/hackyo/p/10345715.html
方法一:
配置docker-ce的镜像源
$ sudo apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common
$ curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) stable"
$ sudo apt update
安装docker-ce软件包
$ sudo apt install docker-ce
方法二(可以指定安装版本):
采用本地安装
首先下载docker-ce的软件包,可以在https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/amd64/找到各个版本,这里我们选择18.06.1下载。
然后使用命令安装
dpkg -i *.deb
安装Kubernetes
- 添加Kubernetes的镜像源
# root
apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-get update
- 安装Kubernetes的核心软件Kubeadm Kubectl Kubelet
# root
apt-get install -y kubeadm kubectl kubelet
其中 kubelet 是运行时支撑软件,kubeadm 是集群配置软件,kubectl 是集群配置软件。
PS:安装时可以通过Kubeadm=1.12.2-00指定安装版本。
搭建Kubernetes集群
- 主节点初始化
ubernetes 除了 kubelet 之外的所有服务均由容器形式运行,因此主节点的配置其实是根据 yaml 文件的描述 pull image 和 run container 的过程,但是由于默认的所有容器从 google 服务器下载,实际上是由于网络问题,其实是不可下载的。
这里需要编写脚本从国内加速镜像预下载所需要的容器镜像,编写的脚本如下:
# replace gcr.io/google-containers/federation-controller-manager-arm64:v1.3.1-beta.1 to real image
# this will convert gcr.io/google-containers/federation-controller-manager-arm64:v1.3.1-beta.1
# to anjia0532/google-containers.federation-controller-manager-arm64:v1.3.1-beta.1 and pull it
# k8s.gcr.io/{image}/{tag} <==> gcr.io/google-containers/{image}/{tag} <==> anjia0532/google-containers.{image}/{tag}
images=$(cat img.txt)
#or
#images=$(cat <<EOF
# gcr.io/google-containers/federation-controller-manager-arm64:v1.3.1-beta.1
# gcr.io/google-containers/federation-controller-manager-arm64:v1.3.1-beta.1
# gcr.io/google-containers/federation-controller-manager-arm64:v1.3.1-beta.1
#EOF
#)
eval $(echo ${images}|
sed 's/k8s\.gcr\.io/anjia0532\/google-containers/g;s/gcr\.io/anjia0532/g;s/\//\./g;s/ /\n/g;s/anjia0532\./anjia0532\//g' |
uniq |
awk '{print "docker pull "$1";"}'
)
# this code will retag all of anjia0532's image from local e.g. anjia0532/google-containers.federation-controller-manager-arm64:v1.3.1-beta.1
# to gcr.io/google-containers/federation-controller-manager-arm64:v1.3.1-beta.1
# k8s.gcr.io/{image}/{tag} <==> gcr.io/google-containers/{image}/{tag} <==> anjia0532/google-containers.{image}/{tag}
for img in $(docker images --format "{{.Repository}}:{{.Tag}}"| grep "anjia0532"); do
n=$(echo ${img}| awk -F'[/.:]' '{printf "gcr.io/%s",$2}')
image=$(echo ${img}| awk -F'[/.:]' '{printf "/%s",$3}')
tag=$(echo ${img}| awk -F'[:]' '{printf ":%s",$2}')
docker tag $img "${n}${image}${tag}"
#[[ ${n} == "gcr.io/google-containers" ]] &&
docker tag $img "k8s.gcr.io${image}${tag}"
done
其中的 image.txt 存储的是需要的镜像的下载地址和名称,对于 master 节点,其内容如下:
k8s.gcr.io/kube-apiserver:v1.12.2
k8s.gcr.io/kube-controller-manager:v1.12.2
k8s.gcr.io/kube-scheduler:v1.12.2
k8s.gcr.io/kube-proxy:v1.12.2
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.2.24
k8s.gcr.io/coredns:1.2.2
注释掉 /etc/fstab
文件里面的swap
分区相关的信息,并重启系统
PS:这一步很关键,没有关闭会出现问题。
再执性主节点初始化命令
$ kubeadm init --pod-network-cidr=10.244.0.0/16
初始化完成之后,会给出三条命令需要去执行。
$ sudo cp /etc/kubernetes/admin.conf $HOME/
$ sudo chown $(id -u):$(id -g) $HOME/admin.conf
$ export KUBECONFIG=$HOME/admin.conf
从节点出现以下问题:
The connection to the server localhost:8080 was refused - did you specify the right host or port?
将主节点的文件拷贝到相同的目录下面然后执行上述命令便可以解决。
可以使用kubectl get pod --all-namespaces
命令查看pods
然后部署 Kubernetes 网络插件
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
如果遇到 coredns 模块不断失败并重启的问题,可以查看coredns的log确定问题,我部署时遇到的问题是coredns模块会卡死在loop,通过修改相关配置文件即可
打开配置文件
$ kubectl -n kube-system edit configmap coredns
然后注释其中的loop所在的那一行。
- 添加从节点到集群
类似主节点的配置,从节点也需要预下载需要的 Docker image, 我们依然使用之前下载脚本,image.txt的内容修改为:
k8s.gcr.io/kube-proxy:v1.12.2
k8s.gcr.io/pause:3.1
下载镜像完成后,执行以下命令获取一个新的token,然后加入节点:
# 因为kubernetes init 初始化主节点时,输出的用于join 的 token 默认只有24小时有效期,失效后可以通过在主节点执行
$ sudo kubeadm token create --print-join-command
- 主节点部署Dashboard
首利用脚本下载相关镜像,img.txt文件的内容为:
k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.0
接下来我们需要一个kubernetes-dashboard.yaml的配置文件,可以直接在Github中下载:
$ wget https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
PS:yaml文件中kubernetes-dashboard-amd64的版本为1.10.1,本地下载的镜像为1.10.0,需要修改yaml文件。
执行以下脚本部署监控软件:
$ kubectl create -f kubernetes-dashboard.yaml
监控界面需要用户登录才可访问,为此我们需要建立相关用户,然后用该用户的 token 登录:
# 创建一个ServiceAccount
$ cat <<EOF | kubectl create -f -
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kube-system
EOF
#再创建一个ClusterRoleBinding,给admin-user相应的权限
$ cat <<EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kube-system
EOF
# 查找admin-user的token
$ kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
执行命令启动proxy
$ kubectl proxy
主节点启动浏览器,访问http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
可能会遇到的问题
[WARNING RequiredIPVSKernelModulesAvailable]: the IPVS proxier will not be used, because the following required kernel modules are not loaded: [ip_vs_wrr ip_vs_sh ip_vs ip_vs_rr] or no builtin kernel ipvs support: map[ip_vs_sh:{} nf_conntrack_ipv4:{} ip_vs:{} ip_vs_rr:{} ip_vs_wrr:{}]
you can solve this problem with following methods:
1. Run 'modprobe -- ' to load missing kernel modules;
2. Provide the missing builtin kernel ipvs support
解决
[root]#modprobe ip_vs_rr
[root]#modprobe ip_vs_wrr
[root]#modprobe ip_vs_sh
[root]#modprobe ip_vs
https://blog.youkuaiyun.com/zhd930818/article/details/79644903
Warning FailedScheduling 6s (x12 over 106s) default-scheduler 0/1 nodes are available: 1 node(s) had taints that the pod didn't tolerate.
解决
# kubectl taint nodes --all node-role.kubernetes.io/master-
http://blog.51cto.com/xudate/2150607