mirror of
				https://github.com/linuxkit/linuxkit.git
				synced 2025-10-31 03:40:16 +00:00 
			
		
		
		
	kubernetes: Build image using Dockerfile and standard build system
This is a pretty straight port of the previous box stuff, without much attempt to clean things up. Image label is a placeholder, will update once a batch of changes are complete. Signed-off-by: Ian Campbell <ijc@docker.com>
This commit is contained in:
		| @@ -1,18 +1,10 @@ | |||||||
| all: build-container-images build-vm-images | all: build-container-images build-vm-images | ||||||
|  |  | ||||||
| BOX_PLANS = kubernetes.rb | build-container-images: | ||||||
|  | 	make -C kubernetes tag | ||||||
|  |  | ||||||
| build-container-images: $(BOX_PLANS) | push-container-images: cache-images | ||||||
| 	for plan in $(BOX_PLANS) ; do \ | 	make -C kubernetes push | ||||||
| 	  docker run --rm -ti \ |  | ||||||
| 	    -v $(PWD):$(PWD) \ |  | ||||||
| 	    -v /var/run/docker.sock:/var/run/docker.sock \ |  | ||||||
| 	    -w $(PWD) \ |  | ||||||
| 	      boxbuilder/box:master $$plan \ |  | ||||||
| 	; done |  | ||||||
|  |  | ||||||
| push-container-images: build-container-images cache-images |  | ||||||
| 	docker image push linuxkit/kubernetes:latest |  | ||||||
| 	docker image push linuxkit/kubernetes:latest-image-cache-common | 	docker image push linuxkit/kubernetes:latest-image-cache-common | ||||||
| 	docker image push linuxkit/kubernetes:latest-image-cache-control-plane | 	docker image push linuxkit/kubernetes:latest-image-cache-control-plane | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,24 +0,0 @@ | |||||||
| @image_name = "linuxkit/kubernetes" |  | ||||||
|  |  | ||||||
| @versions = { |  | ||||||
|   kubernetes: 'v1.6.1', |  | ||||||
|   weave: 'v1.9.4', |  | ||||||
|   cni: '0799f5732f2a11b329d9e3d51b9c8f2e3759f2ff', |  | ||||||
| } |  | ||||||
|  |  | ||||||
| def install_packages pkgs |  | ||||||
|   cmds = [ |  | ||||||
|     %(apk update), |  | ||||||
|     %(apk add #{pkgs.join(' ')}), |  | ||||||
|   ] |  | ||||||
|  |  | ||||||
|   cmds.each { |cmd| run cmd } |  | ||||||
| end |  | ||||||
|  |  | ||||||
| def create_shell_wrapper script, path |  | ||||||
|   run "echo \"#!/bin/sh\n#{script}\n\" > #{path} && chmod 0755 #{path}" |  | ||||||
| end |  | ||||||
|  |  | ||||||
| def mount_bind src, dst |  | ||||||
|   "mount --bind #{src} #{dst}" |  | ||||||
| end |  | ||||||
| @@ -62,7 +62,7 @@ services: | |||||||
|     binds: |     binds: | ||||||
|       - /var/run:/var/run |       - /var/run:/var/run | ||||||
|   - name: kubelet |   - name: kubelet | ||||||
|     image: linuxkit/kubernetes:latest |     image: linuxkitprojects/kubernetes:dev | ||||||
|     capabilities: |     capabilities: | ||||||
|      - all |      - all | ||||||
|     net: host |     net: host | ||||||
|   | |||||||
| @@ -58,7 +58,7 @@ services: | |||||||
|     binds: |     binds: | ||||||
|       - /var/run:/var/run |       - /var/run:/var/run | ||||||
|   - name: kubelet |   - name: kubelet | ||||||
|     image: linuxkit/kubernetes:latest |     image: linuxkitprojects/kubernetes:dev | ||||||
|     capabilities: |     capabilities: | ||||||
|      - all |      - all | ||||||
|     net: host |     net: host | ||||||
|   | |||||||
| @@ -1,77 +0,0 @@ | |||||||
| import 'common.rb' |  | ||||||
|  |  | ||||||
| from "alpine:edge" |  | ||||||
|  |  | ||||||
| def install_node_dependencies |  | ||||||
|   kube_release_artefacts = "https://dl.k8s.io/#{@versions[:kubernetes]}/bin/linux/amd64" |  | ||||||
|   cni_release_artefacts = "https://dl.k8s.io/network-plugins/cni-amd64-#{@versions[:cni]}.tar.gz" |  | ||||||
|   weave_launcher = "https://cloud.weave.works/k8s/v1.6/net?v=#{@versions[:weave]}" |  | ||||||
|  |  | ||||||
|   download_files = [ |  | ||||||
|     '/etc/weave.yaml' => { |  | ||||||
|       url: weave_launcher, |  | ||||||
|       mode: '0644', |  | ||||||
|     }, |  | ||||||
|     '/tmp/cni.tgz' => { |  | ||||||
|       url: cni_release_artefacts, |  | ||||||
|       mode: '0644', |  | ||||||
|     }, |  | ||||||
|     '/usr/bin/kubelet' => { |  | ||||||
|       url: "#{kube_release_artefacts}/kubelet", |  | ||||||
|       mode: '0755', |  | ||||||
|     }, |  | ||||||
|     '/usr/bin/kubeadm' => { |  | ||||||
|       url: "#{kube_release_artefacts}/kubeadm", |  | ||||||
|       mode: '0755', |  | ||||||
|     }, |  | ||||||
|     '/usr/bin/kubectl' => { |  | ||||||
|       url: "#{kube_release_artefacts}/kubectl", |  | ||||||
|       mode: '0755', |  | ||||||
|     }, |  | ||||||
|   ] |  | ||||||
|  |  | ||||||
|   download_files.each do |file| |  | ||||||
|     file.each do |dest,info| |  | ||||||
|       run %(curl --output "#{dest}" --fail --silent --location "#{info[:url]}") |  | ||||||
|       run %(chmod "#{info[:mode]}" "#{dest}") |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
|  |  | ||||||
|   run "mkdir -p /opt/cni/bin /etc/cni/net.d && tar xzf /tmp/cni.tgz -C /opt/cni && rm -f /tmp/cni.tgz" |  | ||||||
| end |  | ||||||
|  |  | ||||||
| def kubelet_cmd |  | ||||||
|   %w( |  | ||||||
|     kubelet |  | ||||||
|       --kubeconfig=/var/lib/kubeadm/kubelet.conf --require-kubeconfig=true |  | ||||||
|       --pod-manifest-path=/var/lib/kubeadm/manifests --allow-privileged=true |  | ||||||
|       --cluster-dns=10.96.0.10 --cluster-domain=cluster.local |  | ||||||
|       --cgroups-per-qos=false --enforce-node-allocatable="" |  | ||||||
|       --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin |  | ||||||
|   ) |  | ||||||
| end |  | ||||||
|  |  | ||||||
| kubelet_dependencies = %w(libc6-compat util-linux iproute2 iptables ebtables ethtool socat curl) |  | ||||||
| install_packages kubelet_dependencies |  | ||||||
| install_node_dependencies |  | ||||||
|  |  | ||||||
| # Exploit shared mounts, give CNI paths back to the host |  | ||||||
| mount_cni_dirs = [ |  | ||||||
|   mount_bind("/opt/cni", "/rootfs/opt/cni"), |  | ||||||
|   mount_bind("/etc/cni", "/rootfs/etc/cni"), |  | ||||||
| ] |  | ||||||
|  |  | ||||||
| # At the moment we trigger `kubeadm init` manually on the master, then start nodes which expect `kubeadm join` args in metadata volume |  | ||||||
| wait_for_node_metadata_or_sleep_until_master_init = "[ ! -e /dev/sr0 ] && sleep 1 || (mount -o ro /dev/sr0 /mnt && kubeadm join --skip-preflight-checks \\\$(cat /mnt/config))" |  | ||||||
|  |  | ||||||
| create_shell_wrapper "#{mount_cni_dirs.join(' && ')} && until #{kubelet_cmd.join(' ')} ; do #{wait_for_node_metadata_or_sleep_until_master_init} ; done", '/usr/bin/kubelet.sh' |  | ||||||
|  |  | ||||||
| create_shell_wrapper "kubeadm init --skip-preflight-checks --kubernetes-version #{@versions[:kubernetes]} && kubectl create -n kube-system -f /etc/weave.yaml", '/usr/bin/kubeadm-init.sh' |  | ||||||
|  |  | ||||||
| flatten |  | ||||||
|  |  | ||||||
| env KUBECONFIG: "/etc/kubernetes/admin.conf" |  | ||||||
|  |  | ||||||
| set_exec entrypoint: %w(kubelet.sh) |  | ||||||
|  |  | ||||||
| tag "#{@image_name}:latest" |  | ||||||
							
								
								
									
										48
									
								
								projects/kubernetes/kubernetes/Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								projects/kubernetes/kubernetes/Dockerfile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | |||||||
|  | #FROM linuxkit/alpine:9bcf61f605ef0ce36cc94d59b8eac307862de6e1 AS build | ||||||
|  | # XXX needs ebtables ethtool iproute2 libc6-compat socat | ||||||
|  | FROM alpine:3.6 AS build | ||||||
|  |  | ||||||
|  | ENV kubernetes_version v1.6.1 | ||||||
|  | ENV weave_version      v1.9.4 | ||||||
|  | ENV cni_version        0799f5732f2a11b329d9e3d51b9c8f2e3759f2ff | ||||||
|  |  | ||||||
|  | ENV kube_release_artefacts "https://dl.k8s.io/${kubernetes_version}/bin/linux/amd64" | ||||||
|  |  | ||||||
|  | RUN apk add -U --no-cache \ | ||||||
|  |   curl \ | ||||||
|  |   && true | ||||||
|  |  | ||||||
|  | RUN mkdir -p /out/etc/apk && cp -r /etc/apk/* /out/etc/apk/ | ||||||
|  | RUN apk add --no-cache --initdb -p /out \ | ||||||
|  |     alpine-baselayout \ | ||||||
|  |     busybox \ | ||||||
|  |     ca-certificates \ | ||||||
|  |     curl \ | ||||||
|  |     ebtables \ | ||||||
|  |     ethtool \ | ||||||
|  |     iproute2 \ | ||||||
|  |     iptables \ | ||||||
|  |     libc6-compat \ | ||||||
|  |     musl \ | ||||||
|  |     socat \ | ||||||
|  |     util-linux \ | ||||||
|  |     && true | ||||||
|  | # Remove apk residuals. We have a read-only rootfs, so apk is of no use. | ||||||
|  | RUN rm -rf /out/etc/apk /out/lib/apk /out/var/cache | ||||||
|  |  | ||||||
|  | ADD kubelet.sh /out/usr/bin/kubelet.sh | ||||||
|  | ADD kubeadm-init.sh /out/usr/bin/kubeadm-init.sh | ||||||
|  |  | ||||||
|  | RUN curl -fSL -o /tmp/cni.tgz https://dl.k8s.io/network-plugins/cni-amd64-${cni_version}.tar.gz && \ | ||||||
|  |     mkdir -p /out/opt/cni /out/etc/cni/net.d && \ | ||||||
|  |     tar -xzf /tmp/cni.tgz -C /out/opt/cni | ||||||
|  | RUN curl -fSL -o /out/etc/weave.yaml https://cloud.weave.works/k8s/v1.6/net?v=${weave_version}  | ||||||
|  | RUN curl -fSL -o /out/usr/bin/kubelet https://dl.k8s.io/${kubernetes_version}/bin/linux/amd64/kubelet && chmod 0755 /out/usr/bin/kubelet | ||||||
|  | RUN curl -fSL -o /out/usr/bin/kubeadm https://dl.k8s.io/${kubernetes_version}/bin/linux/amd64/kubeadm && chmod 0755 /out/usr/bin/kubeadm | ||||||
|  | RUN curl -fSL -o /out/usr/bin/kubectl https://dl.k8s.io/${kubernetes_version}/bin/linux/amd64/kubectl && chmod 0755 /out/usr/bin/kubectl | ||||||
|  |  | ||||||
|  | FROM scratch | ||||||
|  | WORKDIR / | ||||||
|  | ENTRYPOINT ["/usr/bin/kubelet.sh"] | ||||||
|  | COPY --from=build /out / | ||||||
|  | ENV KUBECONFIG "/etc/kubernetes/admin.conf" | ||||||
							
								
								
									
										6
									
								
								projects/kubernetes/kubernetes/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								projects/kubernetes/kubernetes/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | ORG?=linuxkitprojects | ||||||
|  | IMAGE=kubernetes | ||||||
|  | NETWORK=1 | ||||||
|  | NOTRUST=1 | ||||||
|  |  | ||||||
|  | include ../../../pkg/package.mk | ||||||
							
								
								
									
										2
									
								
								projects/kubernetes/kubernetes/kubeadm-init.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										2
									
								
								projects/kubernetes/kubernetes/kubeadm-init.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,2 @@ | |||||||
|  | #!/bin/sh | ||||||
|  | kubeadm init --skip-preflight-checks --kubernetes-version v1.6.1 && kubectl create -n kube-system -f /etc/weave.yaml | ||||||
							
								
								
									
										2
									
								
								projects/kubernetes/kubernetes/kubelet.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										2
									
								
								projects/kubernetes/kubernetes/kubelet.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,2 @@ | |||||||
|  | #!/bin/sh | ||||||
|  | mount --bind /opt/cni /rootfs/opt/cni && mount --bind /etc/cni /rootfs/etc/cni && until kubelet --kubeconfig=/var/lib/kubeadm/kubelet.conf --require-kubeconfig=true --pod-manifest-path=/var/lib/kubeadm/manifests --allow-privileged=true --cluster-dns=10.96.0.10 --cluster-domain=cluster.local --cgroups-per-qos=false --enforce-node-allocatable= --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin ; do [ ! -e /dev/sr0 ] && sleep 1 || (mount -o ro /dev/sr0 /mnt && kubeadm join --skip-preflight-checks $(cat /mnt/config)) ; done | ||||||
		Reference in New Issue
	
	Block a user